React 18 自动批处理模式(react18-batching-patterns)是一份用于诊断和修复 React 18 中自动批处理回归问题的参考技能,主要面向类组件代码库。
核心变更 React 18 扩大了 setState 的批处理范围。在 React 17 中,React 事件处理器内的 setState 会被批处理;而在 setTimeout、Promise 的 .then() / .catch()、async/await、原生 addEventListener 回调中,setState 会立即触发重渲染。在 React 18 中,上述所有场景的 setState 均被批处理。批处理的含义是:同一执行上下文内的所有 setState 调用会在末尾合并为一次重渲染,期间不产生中间渲染。
快速诊断 逐一阅读每个异步类方法。判断:await 之后的代码是否会读取 this.state 来做决策?
- 代码在 await 之后读取 this.state?是 → A 类(静默状态读取缺陷)
- 否,但中间渲染必须对用户可见?是 → C 类(需要 flushSync)
- 否 → B 类(重构,无需 flushSync)
各类别的完整模式可参考:references/batching-categories.md(A、B、C 三类,含完整的前后代码对比);references/flushSync-guide.md(何时使用 flushSync、何时不应使用、导入语法)。
flushSync 规则 应谨慎使用 flushSync。它会强制同步重渲染,绕过 React 18 的并发调度器;过度使用会抵消 React 18 的性能收益。仅在以下情况使用 flushSync:用户必须在异步操作开始前看到中间 UI 状态;加载指示器或 spinner 必须在 fetch 开始前渲染;顺序化 UI 步骤具有各自可见状态(如进度向导、多步骤流程)。在多数情况下,正确的修复方式是重构——调整代码结构,使其不在 await 之后读取 this.state。各类别对应的正确做法参见 references/batching-categories.md。