引言
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 验证收益。