javascript - 不将所有依赖项包含在 useEffect 依赖项数组中是不是一种反模式?

标签 javascript reactjs react-hooks

我正在尝试了解 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 更改时调用效果的目的。我不希望当其他 props 或 ref 改变时调用它。

现在,我读到了一些关于使用 useCallback 来包装它的内容。我尝试过,但没有进一步。

最佳答案

我建议按如下方式编写:

const previousFooRef = useRef(props.foo);

useEffect(() => {
    if (previousFooRef.current !== props.foo) {
       animateSomething(ref, props.onAnimationComplete);
       previousFooRef.current = props.foo;
    }
}, [props.foo, props.onAnimationComplete]);

您无法避免在效果中设置条件的复杂性,因为如果没有它,您将在安装时运行动画,而不是仅在 props.foo 更改时运行。该条件还允许您在 props.foo 以外的其他内容发生变化时避免动画。

通过在依赖项数组中包含 props.onAnimationComplete,您可以避免禁用 lint 规则,这有助于确保您不会引入与缺少依赖项相关的 future 错误。

这是一个工作示例:

Edit animate

关于javascript - 不将所有依赖项包含在 useEffect 依赖项数组中是不是一种反模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55228102/

相关文章:

javascript - JSON.parse 在带有数组的 for 循环内给出 SyntaxError

javascript - 仅为管理员用户启用单选按钮

javascript - 用于 javascript 模板字符串的 Polyfill

javascript - 使用 Gulp 缩小和自动更新 CSS 文件

javascript - 在 PDF 文件上打印生成的 QR 码

reactjs - 你如何在 vscode 中显示 react 组件 props 的预期值?

node.js - Node 错误_xdl(...).ProjectUtils.readConfigJsonAsync不是函数

reactjs - react 钩子(Hook)和setInterval

reactjs - 如何处理useState延迟

javascript - 关闭表单时从 react-hook-form 重置值