【发布时间】:2019-08-09 05:15:28
【问题描述】:
我试图围绕 react 的新 hooks api 进行思考。具体来说,我正在尝试构建曾经是以下内容的经典用例:
componentDidUpdate(prevProps) {
if (prevProps.foo !== this.props.foo) {
// animate dom elements here...
this.animateSomething(this.ref, this.props.onAnimationComplete);
}
}
现在,我尝试使用函数组件和useEffect 构建相同的组件,但不知道该怎么做。这是我尝试过的:
useEffect(() => {
animateSomething(ref, props.onAnimationComplete);
}, [props.foo]);
这样,只有在 props.foo 发生变化时才会调用效果。这确实有效——但是!这似乎是一种反模式,因为eslint-plugin-react-hooks 将此标记为错误。效果内使用的所有依赖项都应在依赖项数组中声明。这意味着我必须执行以下操作:
useEffect(() => {
animateSomething(ref, props.onAnimationComplete);
}, [props.foo, ref, props.onAnimationComplete]);
这不会导致 linting 错误,但它完全违背了 仅 在 props.foo 更改时调用效果的目的。我不想在其他道具或 ref 更改时调用它。
现在,我读到了一些关于使用 useCallback 来包装它的内容。我试过了,但没有进一步。
有人可以帮忙吗?
【问题讨论】:
-
我猜
props.onAnimationComplete变化时不应该触发动画。此外,已经在运行animateSomething仍将使用旧回调。
标签: javascript reactjs react-hooks