【问题标题】:React Hook useEffect has a missing dependency when updating state based on current valueReact Hook useEffect 在根据当前值更新状态时缺少依赖项
【发布时间】:2021-10-19 16:35:17
【问题描述】:

我需要根据当前值更新 React 状态的当前值。但是,使用当前状态会触发警告:React Hook useEffect has a missing dependency。如何更新状态?

为简单起见,假设我必须计算另一个状态的更新次数:

[myState, setMyState] = useState("");
[counter, setCounter] = useState(0);

useEffect(()=>{
 setCounter(counter+1);
},[myState]) // React Hook useEffect has a missing dependency: 'counter'

但是,我不能依赖项中添加 counter,因为 useEffect 将进入 无限循环(因为 hook 将由于counter 更改而再次触发)。

【问题讨论】:

    标签: reactjs react-hooks dependencies


    【解决方案1】:

    实现此类更改的最佳方式是在setState 方法中使用回调。通过使用回调,我们可以访问状态的当前值,而无需直接引用包含状态的对象。这样就不会发出警告,直接执行计数器即可。

    [myState, setMyState] = useState("");
    [counter, setCounter] = useState(0);
    
    useEffect(()=>{
     setCounter(currentCounter => currentCounter+1);
    },[myState]) // No warning here
    
    

    或者如果您需要更复杂的操作:

    useEffect(()=>{
     setCounter(currentCounter => {
       //do stuff
       return currentCounter+1
     });
    },[myState]) // No warning here
    
    

    完整文档:https://reactjs.org/docs/state-and-lifecycle.html#state-updates-may-be-asynchronous

    【讨论】:

    • @NiceBooks 感谢您的链接,我忘了提及文档。这是我在堆栈溢出中经常看到的一种模式,因此我决定发表一篇文章,将 React 提出的问题与此解决方案联系起来。
    猜你喜欢
    • 2021-02-23
    • 2019-10-24
    • 2020-10-26
    • 2020-03-07
    • 2020-02-25
    • 2020-06-11
    • 2020-03-30
    • 2020-12-29
    • 2019-09-20
    相关资源
    最近更新 更多