react是如何实现渲染的
React 渲染机制的核心原理
React 的渲染过程基于虚拟 DOM(Virtual DOM)和协调(Reconciliation)机制。当组件的状态或属性发生变化时,React 会生成新的虚拟 DOM 树,并与旧的虚拟 DOM 树进行比较,计算出最小化的 DOM 操作,最后将这些操作应用到真实 DOM 上。
虚拟 DOM 的作用
虚拟 DOM 是一个轻量级的 JavaScript 对象,用于描述真实 DOM 的结构。React 通过虚拟 DOM 避免了直接操作真实 DOM 的性能开销。虚拟 DOM 的比对(Diffing)算法能够高效地找出需要更新的部分。
协调(Reconciliation)过程
React 通过协调算法比较新旧虚拟 DOM 树的差异。该算法采用启发式策略,假设同层级的节点类型相同时会直接复用,而节点类型不同时会销毁旧节点并创建新节点。这种策略显著提升了比对效率。
Fiber 架构的引入
React 16 引入了 Fiber 架构,将渲染任务拆分为多个可中断的小任务(Fiber 节点)。Fiber 允许 React 在渲染过程中根据优先级暂停或恢复工作,从而支持并发模式和时间切片(Time Slicing)功能。
渲染流程分解
-
初始化阶段

- 创建根 Fiber 节点和虚拟 DOM 树。
- 执行首次渲染(Mounting),生成完整的 DOM 结构。
-
更新阶段
- 状态或属性变化触发重新渲染。
- 生成新的虚拟 DOM 树并与旧树比对。
- 计算差异并生成 DOM 操作指令(如
appendChild、removeChild)。
-
提交阶段
- 将计算出的 DOM 操作批量应用到真实 DOM。
- 执行生命周期钩子(如
componentDidUpdate)或副作用(Effects)。
代码示例:渲染流程
// 组件定义
function MyComponent(props) {
return <div>{props.text}</div>;
}
// ReactDOM 渲染
ReactDOM.render(
<MyComponent text="Hello" />,
document.getElementById('root')
);
性能优化策略
-
Keys 的使用
列表渲染时为子元素添加唯一key,帮助 React 识别节点的稳定性。
{items.map(item => <li key={item.id}>{item.name}</li>)} -
React.memo和useMemo
避免不必要的子组件渲染:const MemoizedComponent = React.memo(MyComponent); -
批量更新(Batching)
React 自动合并多次状态更新以减少渲染次数。
并发模式下的渲染
React 18 的并发渲染器(Concurrent Renderer)允许中断高优先级任务(如用户输入),优先处理紧急更新。通过 startTransition 或 useDeferredValue 实现非阻塞渲染。
function App() {
const [resource, setResource] = useState(null);
const handleClick = () => {
startTransition(() => {
setResource(fetchData()); // 低优先级更新
});
};
return <button onClick={handleClick}>Load</button>;
}
总结
React 的渲染过程通过虚拟 DOM 和协调算法实现高效更新,Fiber 架构进一步支持了可中断的异步渲染。开发者可通过优化策略(如 key、memo)和并发 API 提升应用性能。






