如何使用按钮单击上的钩子重新设置反应弹簧动画?

oem*_*era 3 animation reactjs react-spring react-hooks

以下来自官方示例的简单组件:

import {useSpring, animated} from 'react-spring'

function App() {
  const props = useSpring({opacity: 1, from: {opacity: 0}})
  return <animated.div style={props}>I will fade in</animated.div>
}
Run Code Online (Sandbox Code Playgroud)

问题

如何fadeIn再次为效果(或任何其他动画)设置动画,例如当我单击按钮或解决承诺时?

Pet*_*uzs 6

您基本上可以使用 useSpring 和事件来实现两种效果。

  1. 您可以根据事件的状态更改样式,例如不透明度。

  2. 您可以在状态更改时重新启动动画。重新启动最简单的方法是重新渲染它。

我创建了一个例子。我想你想要第二种情况。在我的示例中,我通过更改其关键属性来重新渲染第二个组件。

const Text1 = ({ on }) => {
  const props = useSpring({ opacity: on ? 1 : 0, from: { opacity: 0 } });
  return <animated.div style={props}>I will fade on and off</animated.div>;
};

const Text2 = () => {
  const props = useSpring({ opacity: 1, from: { opacity: 0 } });
  return <animated.div style={props}>I will restart animation</animated.div>;
};

function App() {
  const [on, set] = React.useState(true);

  return (
    <div className="App">
      <Text1 on={on} />
      <Text2 key={on} />
      <button onClick={() => set(!on)}>{on ? "On" : "Off"}</button>
    </div>
  );
}
Run Code Online (Sandbox Code Playgroud)

这是工作示例:https://codesandbox.io/s/upbeat-kilby-ez7jy

我希望这就是你的意思。

  • 这是一个技巧。我想您知道,如果您在循环中创建反应组件,则必须定义关键属性。React 使用它来决定在更改期间更新哪个组件以及删除哪个组件。它也适用于单个组件。如果您更改密钥,它将被替换为新密钥。我认为你必须创建一个单独的组件,因为你想重新启动 useSpring 初始化。我不知道更简单的解决方案。 (3认同)