Анимация React-spring работает только при первом рендере
Я пытаюсь анимировать новые записи в массиве, как они появляются с react-spring
Он отлично работает при первом рендере, но не обновляется при обновлении
Вот песочница с кодом, где я воспроизвел проблему с интервалом: https://codesandbox.io/s/01672okvpl
import React from "react";
import ReactDOM from "react-dom";
import { Transition, animated, config } from "react-spring";
import "./styles.css";
class App extends React.Component {
state = { fake: ["a", "b", "c", "d", "e", "f"] };
fakeUpdates = () => {
const [head, ...tail] = this.state.fake.reverse();
this.setState({ fake: [...tail, head].reverse() });
};
componentDidMount() {
setInterval(this.fakeUpdates, 2000);
}
componentWillUnmount() {
clearInterval(this.fakeUpdates);
}
render() {
const { fake } = this.state;
return (
<div className="App">
{fake.map((entry, index) => (
<Transition
native
from={{
transform: `translateY(${index === 0 ? "-200%" : "-100%"})`
}}
to={{ transform: "translateY(0)" }}
config={config.slow}
key={index}
>
{styles => <animated.div style={styles}>{entry}</animated.div>}
</Transition>
))}
</div>
);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
Я пробовал с Spring
а также Transition
с тем же результатом.
1 ответ
Ваша проблема в том, что ваш ключ не обновляется. Так как вы заменяете ключ 0 на ключ 0, он, кажется, уже применил переход.
При смене ключа на ${entry}_${index}
, он обновит их ключ до 'a_0', затем 'f_0', которые уникальны и различны, и, следовательно, вызовут нужный эффект.
entry
один только ключ не работает, так как он уже существует в DOM, поэтому он не будет повторно отображать переход.
<Transition
native
from={{
transform: `translateY(${index === 0 ? "-200%" : "-100%"})`
}}
to={{ transform: "translateY(0)" }}
config={config.slow}
key={`${entry}_${index}`}
>
Проверьте это здесь https://codesandbox.io/s/kkp98ry4mo