refs 是否应该列为 useEffect 等的依赖项?

riv*_*riv 8 javascript reactjs eslint react-hooks

据我了解, useRef 返回的容器始终相同 - 但在 useEffect 和类似函数中引用它们会导致 eslint exhausive-deps 警告。在这种情况下忽略警告是否安全?有什么好方法可以避免警告堵塞输出日志以及禁用行注释堵塞我的代码?或者我应该将它们放入依赖项列表中以使 eslint 满意?

cbd*_*per 6

第一次调用时useRef,它会创建一个具有属性的对象current。该对象将在后续渲染中保持不变。即:对该对象的引用不会改变。

https://reactjs.org/docs/hooks-reference.html#useref

在此输入图像描述

因此,从依赖项数组中省略它是安全的。

请参阅下面的代码(也可以在沙盒链接中找到):

https://codesandbox.io/s/cocky-dhawan-ys267?file=/src/App.js

const someRef = useRef({foo: "bar"});
let x = 1;

useEffect(() => {
  console.log(someRef.current.foo);
  console.log(x);
}, []);              // THERE IS A WARNING HERE FOR THE "x"
Run Code Online (Sandbox Code Playgroud)

eslint/exhaustive-deps只担心x,而不担心someRef.current.foo

在此输入图像描述

注意:我只是将其放在x那里以确保警告是由 eslint 触发的。

这背后的原因是useRef与渲染周期无关。我的意思是,它不会重新创建,也不会在每次渲染后自动更新,就像渲染期间创建的状态、道具或变量一样。

您确定您收到此警告的原因是useRef?请参阅 CodeSandbox 链接并仔细检查。检查您如何将它们引用到 中useEffect,并检查您的 React 和 Eslint/插件版本。