如何在每次重新渲染组件时添加动画
How to add animations on every re-render of component
我在 React 上有一个简单的 trivia-app 组件。当我回答一个问题时——我的组件重新呈现新问题,我想为问题块制作一个动画。但是,我在该组件的第一次渲染时只有一次性动画。如何在每次重新渲染组件时制作动画?
这是我的沙箱示例 - https://codesandbox.io/s/youthful-ardinghelli-hn2zx?file=/src/App.js
这是我的代码:
import { useState } from "react";
import "./styles.css";
const questions = ["1", "2", "3", "4", "5"];
const answers = ["asgas", "asgasg", "ashash", "hasdha"];
export default function App() {
const [currentQuestion, setCurrentQuestion] = useState(0);
return (
<>
<h2 className="question">{questions[currentQuestion]}</h2>
<div>
{answers.map((i) => (
<button
onClick={() => {
setCurrentQuestion((prevState) => prevState + 1);
}}
key={i}
>
{i}
</button>
))}
</div>
</>
);
}
.App {
font-family: sans-serif;
text-align: center;
}
.question {
background-color: blue;
animation: fromTop 0.5s linear;
}
@keyframes fromTop {
0% {
transform: translateY(-20%);
}
100% {
transform: translateY(0%);
}
}
只需将一些数据添加到 <h2>
-标签,然后 React 可以重新渲染此标签并开始动画。
<h2 className="question" key={currentQuestion}>{questions[currentQuestion]}</h2>
您不能使用 useEffect()
,因为它不会动画,因为组件尚未“绘制”。
useEffect
在渲染之后执行,但在组件“绘制”之前执行,您必须使用钩子 useLayoutEffect
。此挂钩在组件绘制后执行,因此您将获得更多有关布局的信息,如位置、高度或重量。
我在 React 上有一个简单的 trivia-app 组件。当我回答一个问题时——我的组件重新呈现新问题,我想为问题块制作一个动画。但是,我在该组件的第一次渲染时只有一次性动画。如何在每次重新渲染组件时制作动画?
这是我的沙箱示例 - https://codesandbox.io/s/youthful-ardinghelli-hn2zx?file=/src/App.js
这是我的代码:
import { useState } from "react";
import "./styles.css";
const questions = ["1", "2", "3", "4", "5"];
const answers = ["asgas", "asgasg", "ashash", "hasdha"];
export default function App() {
const [currentQuestion, setCurrentQuestion] = useState(0);
return (
<>
<h2 className="question">{questions[currentQuestion]}</h2>
<div>
{answers.map((i) => (
<button
onClick={() => {
setCurrentQuestion((prevState) => prevState + 1);
}}
key={i}
>
{i}
</button>
))}
</div>
</>
);
}
.App {
font-family: sans-serif;
text-align: center;
}
.question {
background-color: blue;
animation: fromTop 0.5s linear;
}
@keyframes fromTop {
0% {
transform: translateY(-20%);
}
100% {
transform: translateY(0%);
}
}
只需将一些数据添加到 <h2>
-标签,然后 React 可以重新渲染此标签并开始动画。
<h2 className="question" key={currentQuestion}>{questions[currentQuestion]}</h2>
您不能使用 useEffect()
,因为它不会动画,因为组件尚未“绘制”。
useEffect
在渲染之后执行,但在组件“绘制”之前执行,您必须使用钩子 useLayoutEffect
。此挂钩在组件绘制后执行,因此您将获得更多有关布局的信息,如位置、高度或重量。