javascript - 带有动画和 useEffect 的 React.useState

标签 javascript reactjs react-hooks

我正在尝试使用使用 useState 和 useEffect 的包装器组件来实现动画。

如果 Prop 上的某个值发生变化,我希望它能触发动画的开始:

const propVal = getter(props);
const mounted = useRef(true);
useEffect(() => {
  //code to initialize and start animation removed

  //because a started animation uses requestAnimationFrame
  //a component may want to set state for animation while not
  //mounted anymore, prevent the error by setting mounted to false
  return () => (mounted.current = false);
}, [propVal]);//<--if propVal changes the animation starts

完整代码是 here

propVal 可以是项目的 ID(新项目将以动画形式出现)或名为 deleted 的属性,指示项目已被删除(应该以动画形式消失)

我正在尝试创建一个较小的代码示例来重现我面临但无法(尚未)这样做的问题。

问题是,如果我删除一个项目,那么即使组件没有卸载,mounted.current = false(从 useEffects 返回的回调)部分也会被调用。

当我将代码更改为 return () => false && (mounted.current = false); 时,基本上删除了保护措施以防止未安装的组件进行动画处理,然后删除项目将进行动画处理而不会出现错误。这告诉我组件没有卸载,但以某种方式调用了 onUnmount 的返回回调。

很抱歉(还)不能提供这个问题的更简单的重现。也许有人知道为什么在组件明显没有卸载时会调用回调(移除安全 guard 不会导致错误并按预期进行动画处理)

最佳答案

如果我没理解错的话,你应该在 effect 中将 mounted ref 设置为 true。 否则,对 propVal 依赖项的任何更改都会使 recurAnimate 停止工作。

假设值从 id => 变为“已删除”, 清理效果运行但组件未卸载, 然后效果以新值再次运行,但 isMounted ref 保持 recurAnimate 锁定。

编辑:从 effect !== componentWillUnmount 返回的清理函数。 它会在每次效果重新运行时运行,最后在组件卸载时运行。

关于javascript - 带有动画和 useEffect 的 React.useState,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57527969/

相关文章:

javascript - 使用可旋转类停止元素在鼠标滚动上移动

java - 您能推荐任何可嵌入的 Javascript 引擎吗?

javascript - `[WDS] Disconnected` ReactJS,网络包

javascript - react native : state is getting undefined inside useCallBack hook function

reactjs - React 库中的 React hooks 给出无效的 hook 调用错误

firebase - 使用 firestore 数据进行 React hooks - 30 秒内读取 1.1k 次(来自包含 3 个文档和 2 个属性的 2 个集合)

javascript - jQuery 数据表 : Weird sorting with Dates

javascript - ng-google-chart 柱形图中每列的自定义颜色

javascript - react / react Hook : I am trying to trigger a validation using hooks whenever a user leaves input field

javascript - ReactJs:如何更新状态属性