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

时间:2019-12-10 15:50:23

标签: javascript reactjs jsx react-hooks

我有以下情况:

barplot(prop.table(table(data$sexo,data$pais), margin=1))

这可以很好地工作,并且完全符合我的要求,但是ESLint发出 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]); 警告。

当我执行自动修复时,它会将react-hooks/exhaustive-deps添加为useEffect的依赖项,但是这会导致无限循环。这似乎是一个简单的情况,但我无法弄清楚自己在做什么错。我见过在useEffect中使用setState之类的其他人的代码,而没有将其声明为依赖项。

1 个答案:

答案 0 :(得分:1)

您应使用useState中的functional updater form,它将提供您状态的快照,从而消除了直接引用它的需要。

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

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

  

我喜欢将这些情况视为“虚假依赖项”。是的,算是   必要的依赖关系,因为我们在内部编写了setCount(count + 1)   影响。但是,我们只需要计数即可将其转换为计数   + 1并“发回”到React。但是React已经知道当前的数量了。我们需要告诉React的就是增加状态-   不管现在是什么。

Font