ESLint 希望 setSate 作为 useEffect 的依赖项,但这会导致无限循环(react-hooks/exhaustive-deps)

Posted

技术标签:

【中文标题】ESLint 希望 setSate 作为 useEffect 的依赖项,但这会导致无限循环(react-hooks/exhaustive-deps)【英文标题】:ESLint wants setSate as a dependency for useEffect but this causes an infinite loop (react-hooks/exhaustive-deps) 【发布时间】:2020-04-03 20:40:52 【问题描述】:

我有以下情况:

  const [values, setValues] = useState(
    username: "",
    password: ""
  );

  const [submitButton, setSubmitButton] = useState(
    disabled: true
  );

 useEffect(() => 
    const disabled = !(values.username.length && values.password.length);

    setSubmitButton( ...submitButton, disabled );
  , [values]);

这工作得很好,完全符合我的要求,但 ESLint 抱怨 react-hooks/exhaustive-deps 警告。

当我执行 eslint autofix 时,它会将 setSubmitButton 添加为 useEffect 的依赖项,但这会导致无限循环。这似乎是一个简单的情况,但我无法弄清楚我做错了什么。我已经看到其他人的代码在 useEffect 中使用 setState 等而不将其声明为依赖项。

【问题讨论】:

【参考方案1】:

您应该使用useState 的functional updater form,它将提供您状态的快照,从而无需直接引用它。

setSubmitButton(previous => ( ...previous, disabled ));

由于React 已经知道submitButton 的当前值,并且只会在更改状态时运行回调,这将在您的组件范围之外发生,eslint 不会对您生气。 在Dan's的话

我喜欢将这些情况视为“错误依赖”。是的,计数是 一个必要的依赖,因为我们在里面写了 setCount(count + 1) 影响。然而,我们只需要 count 将其转换为 count + 1 并将其“发送回”给 React。但是 React 已经知道当前的计数。我们需要告诉 React 的只是增加状态—— 不管现在是什么。

Font

【讨论】:

非常感谢!这正是我所需要的。 如果我需要直接引用该状态怎么办?我有一个用例,我必须更新该状态并根据该状态更新另一个状态。 这太模糊了。请考虑将帖子作为一个问题,对您的问题进行更详细的描述

以上是关于ESLint 希望 setSate 作为 useEffect 的依赖项,但这会导致无限循环(react-hooks/exhaustive-deps)的主要内容,如果未能解决你的问题,请参考以下文章

You may use special comments to disable some warnings. Use // eslint-disable-next-line……

无法加载在 'package.json » eslint-config-react-app' 中声明的插件 'flowtype':找不到模块 'eslint/use-at-your-own-risk'

ESlint 为啥会有 Using ForInStatement'is not allowed

ESLint Disallow Use of Alert (no-alert)

vue项目中eslint 警告'xxx is defined but never used'解决方法

vue运行报错--eslint