点击加号四次,计数只从 0 变成 1。React DevTools 里四次更新都触发了,记录下来的值全是 1。日志里能对上时间点,这种反而好排。

四次调用都用了同一个闭包里的 count,每次都算 0 加 1 再写回。事件内的批量更新合并后只剩最后一次结果,中间三次被覆盖。这一点先确认清楚,后面就不用反复试。

setCount(c => c + 1);
setCount(c => c + 1); // 同一个事件里也能累加

「setState 闭包旧值」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

处理上按这个顺序:改成函数式更新 让上一个值参与计算;能合并的连续更新就合成一次 dispatch;在回调里打印参数 确认拿到的是最新值;连点十次核对最终数字。

结果对不对很好判断,连点四次计数到 4,DevTools 里四次更新依次是 1、2、3、4。

作者 9823189