Eslint react-hooks/exhaustive derps recursion



我需要一些帮助来理解eslintreact-hooks/exhaustive derps。我只想在listenToMe更改时运行效果,但react-hooks/exhaustive derps对我大喊要添加history。这会导致递归。在这条规则出台之前,useEffect对我来说是React黄金。

ESLint:React Hook useEffect缺少依赖项:"history"。包括它们或删除依赖项数组。(反应挂钩/穷举deps(

有人能帮我理解吗:

  1. 为什么在useEffect中只听你关心的更改是不好的做法
  2. 只听取状态变化的具体变化的"正确"方式是什么
useEffect(() => {
if (listenToMe) {
const search = new URLSearchParams(location.search);
search.delete('q')
history.replace({ ...location, search: search.toString() });
}
}
}, [listenToMe]);

我读过github并做出了反应,但我没有读到任何点击。

  • https://github.com/facebook/create-react-app/issues/6880
  • https://reactjs.org/docs/hooks-rules.html
  • 许多其他

从文档

只有当函数(或其调用的函数(中没有任何内容引用道具、状态或从中派生的值时,才可以安全地从依赖项列表中省略函数。

当您使用传递的道具时,或者在您的情况下,历史道具来自HOC或来自react路由器的钩子时,就会出现问题。

首先,它是作为道具传递的,道具本身就可以改变。

其次,您正在调用history.push函数。linter不知道push将始终是历史类的相同函数,并且该函数本身不会使用任何状态或道具。

根据facebook的说法,"正确"的方法是将函数移动到效果内部,但如果你只是重复使用某个文件中的代码或使用history.push这样的函数,那就没有意义了。所以我认为在你的情况下,解决方案是将其包装在一个useCallback中,并在其自己的dependency数组中包含历史记录。根据开发人员的说法,这是最后的手段。

从本质上讲,useCallback只会返回一个内存化的值,而不是实际访问该值,并且每当其依赖性中的值发生变化时,就会有一个带有新内存化值的新回调。

History.push当然总是有相同的身份,所以这有点反模式。

就我个人而言,我从来没有遇到过像这样传递价值观的问题。因此,我认为,当您只处理在其他地方声明的函数(或任何完全稳定的变量(时,编写useCallback是毫无意义的,我认为跳过这一行是合理的。

然而,正如其他人所指出的那样,我保持这条规则的有效性,因为让你对写作效果保持警觉是件好事。

这个esint规则只是在大多数情况下有用的提示,但在某些情况下你必须忽略它。

React.useEffect(()=> {
// I have some code with dependencies here but I only want to run it on mount
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])
React禁用了自动修复程序https://github.com/facebook/react/issues/15204

我安装了新的devDependancies(eslint@latesteslint-plugin-react-hooks(

npm install eslint@latest eslint-plugin-react-hooks@latest --save-dev 

我在IntelliJ IDEA 2020.1(EAP版本号IU-201.5985.32(中进行了测试,它显示警告,但ESLint Fix不会自动将依赖性添加到useEffect

IntelliJ中的ESLint警告

ESLint:React Hook useEffect缺少依赖项:"dispatch"。请将其包括在内或删除依赖项数组。如果"dispatch"更改太频繁,请找到定义它的父组件,并将该定义包装在useCallback中。(反应挂钩/穷举deps(

VS代码具有";"修复";在预发布的2.1.0-next.1中,但我还没有测试过。

https://github.com/microsoft/vscode-eslint/pull/814#issuecomment-587020489https://github.com/microsoft/vscode-eslint/releases/tag/release%2F2.1.0-下一个.1

这并不能回答问题,但对任何遇到react-hooks/exhaustive-depsauto"的人都有帮助;"修复";问题。

最新更新