ReactJS - 动画:让您的组件生动起来
你好,未来的React动画大师们!我很高兴能成为您在这激动人心的ReactJS动画世界中的向导。作为一个教计算机科学多年的老师,我可以告诉您,动画就像是秘密酱汁,让您的应用程序不仅功能齐全,而且非常愉悦。那么,让我们跳进去,让这些组件跳起舞吧!
React Transition Group的魔法
在我们开始玩转动画之前,让我们先了解一下React Transition Group。把它想象成一个装满巧妙小工具的工具箱,帮助我们创建应用程序中平滑、吸引眼球的过渡效果。
安装React Transition Group
首先,我们需要邀请React Transition Group加入我们的项目派对。打开您的终端并输入:
npm install react-transition-group
或者如果您是yarn的粉丝:
yarn add react-transition-group
太棒了!现在我们在指尖上拥有了动画的超能力。
Transition:动画的基石
Transition
组件就像是房子的地基。它为我们构建动画提供了一个坚实的基础。让我们通过一个简单的例子来看看它是如何工作的:
import React, { useState } from 'react';
import { Transition } from 'react-transition-group';
const duration = 300;
const defaultStyle = {
transition: `opacity ${duration}ms ease-in-out`,
opacity: 0,
}
const transitionStyles = {
entering: { opacity: 1 },
entered: { opacity: 1 },
exiting: { opacity: 0 },
exited: { opacity: 0 },
};
const FadeInOut = () => {
const [inProp, setInProp] = useState(false);
return (
<div>
<Transition in={inProp} timeout={duration}>
{state => (
<div style={{
...defaultStyle,
...transitionStyles[state]
}}>
我是一个渐变的文本!
</div>
)}
</Transition>
<button onClick={() => setInProp(!inProp)}>
点击以渐变
</button>
</div>
);
};
让我们分解一下:
- 我们从'react-transition-group'中导入
Transition
。 - 我们设置了一些样式:一个
defaultStyle
作为我们的初始状态,以及transitionStyles
用于不同阶段的过渡。 - 我们的
FadeInOut
组件使用状态inProp
来控制可见性。 -
Transition
组件接受两个主要属性:in
(我们的可见性状态)和timeout
(动画的持续时间)。 - 在
Transition
内部,我们使用一个函数接收当前的过渡状态并应用相应的样式。
当您点击按钮时,您会看到文本平滑地淡入和淡出。魔法,对吧?
CSSTransition:当CSS遇见React
现在,让我们升级我们的游戏,使用CSSTransition
。它是Transition
的更酷的兄弟,可以无缝地与CSS类一起工作。这里有一个有趣的例子:
import React, { useState } from 'react';
import { CSSTransition } from 'react-transition-group';
import './styles.css'; // 我们稍后创建这个
const Superhero = () => {
const [inProp, setInProp] = useState(false);
return (
<div>
<CSSTransition in={inProp} timeout={300} classNames="super">
<div className="superhero">
我是一个超级英雄!
</div>
</CSSTransition>
<button onClick={() => setInProp(!inProp)}>
变身!
</button>
</div>
);
};
这是我们的CSS(在styles.css
中):
.superhero {
background-color: #f0f0f0;
padding: 20px;
border-radius: 5px;
}
.super-enter {
opacity: 0;
transform: scale(0.9);
}
.super-enter-active {
opacity: 1;
transform: translateX(0);
transition: opacity 300ms, transform 300ms;
}
.super-exit {
opacity: 1;
}
.super-exit-active {
opacity: 0;
transform: scale(0.9);
transition: opacity 300ms, transform 300ms;
}
这里发生了什么:
- 我们使用
CSSTransition
而不是Transition
。 - 我们指定
classNames="super"
,告诉React使用像super-enter
、super-enter-active
等类。 - 我们的CSS定义了组件在每个过渡阶段应该看起来如何。
当您点击"变身!"时,我们的超级英雄会以缩放效果戏剧性地出现和消失。就像在浏览器中观看超级英雄电影一样!
TransitionGroup:处理多个过渡
最后但并非最不重要的是,让我们来谈谈TransitionGroup
。它就像乐队中的指挥,同时管理多个过渡。这里有一个实际的例子:
import React, { useState } from 'react';
import { CSSTransition, TransitionGroup } from 'react-transition-group';
import './list-styles.css';
const TodoList = () => {
const [items, setItems] = useState([]);
const [inputValue, setInputValue] = useState('');
const addItem = () => {
setItems([...items, { id: Date.now(), text: inputValue }]);
setInputValue('');
};
const removeItem = (id) => {
setItems(items.filter(item => item.id !== id));
};
return (
<div>
<input
value={inputValue}
onChange={(e) => setInputValue(e.target.value)}
placeholder="输入一个任务"
/>
<button onClick={addItem}>添加</button>
<TransitionGroup className="todo-list">
{items.map(({ id, text }) => (
<CSSTransition
key={id}
timeout={500}
classNames="item"
>
<div className="todo-item">
{text}
<button onClick={() => removeItem(id)}>X</button>
</div>
</CSSTransition>
))}
</TransitionGroup>
</div>
);
};
相应的CSS(list-styles.css
):
.todo-list {
list-style-type: none;
padding: 0;
}
.todo-item {
background-color: #f9f9f9;
border: 1px solid #ddd;
padding: 10px;
margin-bottom: 10px;
display: flex;
justify-content: space-between;
}
.item-enter {
opacity: 0;
}
.item-enter-active {
opacity: 1;
transition: opacity 500ms ease-in;
}
.item-exit {
opacity: 1;
}
.item-exit-active {
opacity: 0;
transition: opacity 500ms ease-in;
}
这个例子创建了一个简单的待办事项列表,其中项目在添加时淡入,在删除时淡出。这里是分解:
- 我们使用
TransitionGroup
来包装我们的项目列表。 - 每个项目都被包装在
CSSTransition
中。 - 当项目被添加或删除时,
TransitionGroup
自动管理过渡。
结果呢?一个平滑、专业的待办事项列表,任何项目经理都会为之骄傲!
结束语
就这样,伙计们!我们一起穿越了React动画的土地,从基本的Transition
到强大的TransitionGroup
。记住,动画不仅仅是为了让东西看起来漂亮(尽管这是一个很好的额外收获),它们还创造了直观、响应式的界面,引导用户通过您的应用程序。
这里是一个我们覆盖的方法的快速参考表:
组件 | 用例 | 关键属性 |
---|---|---|
Transition | 基本过渡 |
in , timeout
|
CSSTransition | 基于CSS的过渡 |
in , timeout , classNames
|
TransitionGroup | 管理多个过渡 |
component (可选) |
现在,去 forth 和动画化吧!记住,能力越大,责任越大。明智地使用动画,用户会感谢您的。快乐编码!
Credits: Image by storyset