React 15 的 reconciliation(协调)是递归同步的:组件树一旦开始 diff 就停不下来,大更新会长时间卡住主线程(掉帧、输入无响应)。React 16 的 Fiber 把组件树改成链表式的 fiber 节点树,渲染工作被切成一小块一小块,每做完一块就检查时间片用完没有——用完了把控制权交还浏览器(画画、响应输入),空闲了从中断点恢复继续。
Fiber 上的更新分优先级:用户输入(高优先级)可以插队打断低优先级的渲染任务。双缓存机制(current 树与 workInProgress 树)让中断恢复有一致的基础。并发模式(Concurrent Mode)与 useTransition、Suspense 都是建立在这套机制之上的开发者 API。
// Fiber 对开发者是不可见的,但能从行为上感受它
import { useTransition, useState } from 'react';
function Search({ list }) {
const [q, setQ] = useState('');
const [isPending, startTransition] = useTransition(); // ★ 并发 API
// 把「低优先级的大列表过滤」标记为 transition
const onChange = e => {
setQ(e.target.value); // 高优先级:输入框立刻刷新
startTransition(() => {
setResults(hugeFilter(list, e.target.value)); // 低优:可被打断
});
};
// isPending 时可以显示 Loading,列表更新流畅不卡输入
return <input value={q} onChange={onChange} />;
}
// 同步渲染的旧时代问题(React 15):
// 大列表 setState → 主线程被占满百毫秒 → 输入框打字延迟