外观
如何理解React 状态快照与闭包?
标准回答
React 将某次渲染的状态传给组件,事件处理函数和异步闭包通常捕获该次渲染中的值。调用状态 setter 请求后续更新,不会让当前闭包中的变量立即变成新值。连续依赖旧值更新时,函数式更新能表达如何从最新待处理状态计算下一状态。
定时器、请求回调和订阅容易读到旧状态。修复应先判断它需要哪一代数据:需要固定本次请求参数时,闭包是正确的;需要最新状态时,使用合适的更新方式或引用。不能为消除旧闭包而把所有状态都搬进 ref,导致 UI 不再随变化更新。
Console 中的选择项、查询结果、加载状态和治理状态应有清晰归属。服务端权威状态不应因为本地乐观更新就被当作已完成;错误时恢复界面并保留可重试路径。
追问与回答
为什么连续调用三次 setCount(count + 1) 可能只加一次
它们使用同一次渲染的 count,表达相同的目标值;使用基于前一个待处理值的函数更新可以表达三次递增。
useMemo 能否解决状态不一致
它是计算缓存工具,不是业务正确性协议。依赖错误或服务端状态错误不会被 memo 自动修复。
易混淆点
- 把状态 setter 当成同步修改局部变量。
参考资料
内容来源
- Android 与 AI 工程 Wiki · 原条目
q183