引言

React 18 于 2022 年发布,这是一次重要版本升级。它在保持向后兼容的同时,引入了并发渲染(Concurrent Rendering)、自动批处理(Automatic Batching)、useId/useTransition 等特性,显著提升了大型应用的交互流畅度与可维护性。

并发特性与渲染模型

并发渲染允许 React 将渲染工作分片,并在更高优先级任务到来时中断与恢复,从而避免长时间卡顿。它不是多线程,而是可中断的协作式渲染模型,默认通过 createRoot 开启:

import { createRoot } from 'react-dom/client';

const root = createRoot(document.getElementById('root'));
root.render(<App />);

自动批处理(Automatic Batching)

在 React 18 之前,批处理主要发生在 React 事件中。现在包括 setTimeout、Promise 回调、原生事件等上下文中的多次 setState 也会合并为一次渲染:

function Demo(){
  const [count, setCount] = useState(0);
  const [flag, setFlag] = useState(false);
  function handle(){
    setTimeout(() => {
      setCount(c => c + 1);
      setFlag(f => !f);
      // React 18 中只触发一次渲染
    });
  }
  return <button onClick={handle}>Click</button>;
}

useTransition:区分紧急与非紧急更新

通过 useTransition 将某些更新标记为非阻塞,优先保证输入等即时反馈:

const [isPending, startTransition] = useTransition();
const [text, setText] = useState('');

function onChange(e){
  const v = e.target.value;
  setText(v); // 紧急更新(输入光标流畅)
  startTransition(() => {
    // 非紧急:大列表筛选、复杂计算
    filterBigList(v);
  });
}

Suspense 改进与数据获取

Suspense 在 React 18 中体验更佳,可与路由、代码分割与数据获取库配合,统一“加载中”体验:

<Suspense fallback={<Spinner />}>
  <Profile />
  <Posts />
</Suspense>

迁移与落地建议

  • 渐进启用:先将根渲染切换到 createRoot,验证关键路径的交互是否受益。
  • 标注优先级:使用 useTransition 区分输入与计算,避免主线程长任务。
  • 配合监控:结合性能指标(FID/INP/FPS)评估前后差异。

总结

React 18 的并发能力与批处理显著提升了交互流畅度。建议在关键场景(输入筛选、列表渲染、代码分割)优先尝试,并配合监控与 A/B 验证收益。