深入 React 渲染模型:Fiber、并发与 useTransition
从栈调和到 Fiber 架构,理解 React 如何实现可中断的渲染,以及并发特性背后的调度原理。
理解 React 的渲染模型,是写出高性能组件的关键。本文带你从 Fiber 架构出发,看清「可中断渲染」与并发特性的本质。
从栈调和到 Fiber
早期 React 用递归的「栈调和」遍历组件树,一旦开始渲染就无法中断,长任务会阻塞主线程,导致掉帧。
Fiber 把渲染工作拆成一个个可中断的单元,并用链表结构组织,使得 React 可以在多个工作单元之间让出主线程,处理更高优先级的更新(如用户输入)。
两阶段渲染
Fiber 引入了渲染的两个阶段:
- Render 阶段:构建 Fiber 树,计算差异,可中断;
- Commit 阶段:把差异一次性应用到 DOM,不可中断。
「可中断」的能力,是后面所有并发特性的地基。
并发与调度
React 通过调度器(Scheduler)为不同更新分配优先级:
- 用户输入、动画 → 高优先级,立即处理;
- 数据请求后的渲染 → 可被中断,稍后继续。
这带来一个重要的认知转变:一次 setState 触发的渲染,未必会立即、完整地执行。
useTransition:标记低优先级更新
useTransition 让你把某次更新标记为「过渡」,React 会降低它的优先级:
const [isPending, startTransition] = useTransition();
startTransition(() => {
setSearchQuery(keyword); // 低优先级,可被输入打断
});
配合 useDeferredValue,可以显著改善搜索、筛选这类「输入即重算」场景的卡顿。
结语
Fiber 与并发的本质,是 React 在「响应速度」与「计算完整性」之间做的精细权衡。理解它,你就能理解为什么某些优化手法有效,而另一些只是心理安慰。