我正在尝试了解 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 错误,但它完全违背了目的only调用效果时props.foo
变化。我不希望当其他道具或裁判发生变化时调用它。
现在,我读到了一些关于使用useCallback
来包装这个。我尝试过但没有进一步。