我需要一些帮助来理解eslint
react-hooks/exhaustive derps
。我只想在listenToMe
更改时运行效果,但react-hooks/exhaustive derps
对我大喊要添加history
。这会导致递归。在这条规则出台之前,useEffect
对我来说是React黄金。
ESLint:React Hook useEffect缺少依赖项:"history"。包括它们或删除依赖项数组。(反应挂钩/穷举deps(
有人能帮我理解吗:
- 为什么在useEffect中只听你关心的更改是不好的做法
- 只听取状态变化的具体变化的"正确"方式是什么
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
}, [])
我安装了新的devDependancies
(eslint@latest
和eslint-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-deps
auto"的人都有帮助;"修复";问题。