前端知库

React 中的过期闭包为什么会读到旧状态?

参考答案

每次渲染都有自己的变量和函数闭包。计时器、订阅或 memoized 回调如果长期引用旧渲染中的函数,就会继续读取那次渲染的状态快照,这通常不是 React 没更新,而是回调引用没有更新。

新状态依赖旧状态时使用函数式更新;同步外部系统时列出正确依赖并清理旧订阅;确实需要读取最新值但不触发渲染的场景可用 ref。不同选择对应不同语义,不能统一通过删依赖修复。

例如计时器累加器可以 setCount(c => c + 1),但读取多个业务变量时仍需设计同步关系。将所有状态复制进 ref 会隐藏数据流,应只在明确需要脱离渲染快照的边界使用。