useEffect 里怎么正确获取最新的 state 值?
我在 useEffect 里想用最新的 count 值,但每次拿到的都是初始值 0,明明页面上已经显示更新后的数字了。是不是闭包的问题?我试过加依赖数组,也试过不加,都不行。
代码大概是这样的:
import { useState, useEffect } from 'react';
function MyComponent() {
const [count, setCount] = useState(0);
useEffect(() => {
const timer = setInterval(() => {
console.log(count); // 这里总是输出 0
setCount(c => c + 1);
}, 1000);
return () => clearInterval(timer);
}, []); // 只在挂载时运行一次
return <div>{count}</div>;
}
这到底该怎么解决啊?
标准写法是在依赖数组里加入需要追踪的state变量。把count加到依赖数组就能解决这个问题:
不过要注意这样会每秒创建新的定时器。如果只是想间隔更新状态,考虑用 useRef 或者直接在setInterval里使用函数式更新:
这个坑我也踩过不少次,React的闭包真是让人又爱又恨啊。
最直接的解决方案是用 useRef 存最新值:
如果你只是想在 setCount 的时候用到当前值,函数式更新其实就能搞定,不需要 ref:
但如果你需要在回调里做其他操作(比如判断 count 是否大于某个值再决定下一步),那就得上 ref 了。
另外提醒一下,如果你在依赖数组里加 count,timer 会每次 count 变化时都重建,这个频率就太高了,不推荐。