标准答案

  1. 批处理更新意味着多次 setState 不一定触发多次渲染,React 会把它们放进同一批处理流程。
  2. React 18 之前,自动批处理主要发生在 React 事件处理函数中。
  3. React 18 使用 createRoot 后,Promise、setTimeout、原生事件等场景中的更新也可以自动批处理。
  4. 批处理会影响读取状态的时机,调用 setState 后不能立刻假设当前变量已经更新。
  5. 少数必须同步刷新 DOM 的场景可以使用 flushSync,但应谨慎使用。

题目解析

这道题和 state 异步更新、函数式更新关系很近。批处理提升性能,但也要求开发者理解 state 快照。

React 18 的自动批处理让更多异步回调里的多次更新合并,减少了额外渲染。

如果逻辑依赖更新后的 DOM,通常要重新审视设计,而不是默认用 flushSync。

代码示例

下面两次状态更新会被 React 合并处理,通常只触发一次渲染。

TSX
function handleSubmit() {
  setLoading(true)
  setError('')
}

setTimeout(() => {
  setCount(prev => prev + 1)
  setFlag(true)
}, 100)

常见误区

  • 认为每次 setState 都一定立刻触发一次渲染。
  • React 18 自动批处理后,仍用旧心智模型判断异步回调里的渲染次数。
  • 滥用 flushSync,让 React 无法正常调度更新。

作者信息