You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React useEffect更新state报缺少依赖且加依赖会无限循环如何解决

正确解决方案

你遇到的这个场景可以直接使用useState更新函数的回调写法解决,这也是这类需求的官方推荐方案:
React 中useState返回的状态更新函数支持传入一个回调作为参数,这个回调会自动接收到更新前的最新状态值作为入参,你不需要手动引入外部的状态变量,就能基于旧值计算新值。

你的示例代码修改后如下:

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

useEffect(() => {
  // 传入回调,prevCounter 是更新前的最新 counter 值
  setCounter(prevCounter => prevCounter + 1);
}, [myState]) 

修改后就可以同时解决两个问题:

  • 不需要把counter加入依赖数组,不会触发无限循环
  • ESLint 不会再报依赖缺失的警告,因为 useEffect 作用域内确实没有用到外部的counter变量
  • 拿到的永远是最新的状态值,不会出现闭包导致的旧值问题

如果遇到更复杂的多状态依赖场景,你也可以用useRef同步保存状态的最新值,避免在依赖数组里加变量:

const [counter, setCounter] = useState(0);
const counterRef = useRef(counter);

// 同步状态到 ref
useEffect(() => {
  counterRef.current = counter;
}, [counter])

// 其他副作用中直接读取 ref 的值,不需要加 counter 到依赖
useEffect(() => {
  setCounter(counterRef.current + 1);
}, [myState])

内容的提问来源于stack exchange,提问作者Andrea Costanzo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 19:54:03