Skip to content

React 18 (核心)新特性

自动批处理机制

什么是批处理?

批处理就是将多个状态更新操作收集起来,合并到一次重新渲染中执行的优化机制。

批处理的核心价值:

  • 性能优化:减少不必要的重新渲染。
  • 用户体验:避免界面闪烁和卡顿。
  • 节约资源;降低 cpu 计算开销。

React 17 及之前的批处理

jsx
// ✅ React 事件处理器内部
function handleClick() {
  setCount((c) => c + 1)
  setFlag((f) => !f)
  // 只会渲染一次
}

// ❌ setTimeout 回调
setTimeout(() => {
  setCount((c) => c + 1) // 触发第一次渲染
  setFlag((f) => !f) // 触发第二次渲染
}, 1000)

// ❌ Promise 回调
Promise.resolve().then(() => {
  setCount((c) => c + 1) // 触发第一次渲染
  setFlag((f) => !f) // 触发第二次渲染
})

// ❌ 原生事件处理器
document.getElementById('btn').addEventListener('click', () => {
  setCount((c) => c + 1) // 触发第一次渲染
  setFlag((f) => !f) // 触发第二次渲染
})

在 React 18 以后,自动批处理全场景覆盖:

  • React 事件处理器
  • setTimeout 回调
  • Promise 回调
  • 原生事件处理器
  • 任何异步操作

特殊情况:flushSync

有时候确实需要 立即同步 执行状态更新,React 18 提供了 flushSync API:

jsx
import { flushSync } from 'react-dom'

function handleClick() {
  flushSync(() => {
    setCount((c) => c + 1) // 触发第一次渲染
  })
  // 此时 DOM 已经更新完成

  // 可以安全地读取 DOM 或与第三方库交互
  const element = document.getElementById('counter')
  console.log('Current count:', element.textContent) // 显示最新的值
}

flushSync 一定要谨慎使用!

基于 MIT 许可发布