react如何把虚拟dom渲染到页面
React 虚拟 DOM 渲染到页面的过程
React 通过虚拟 DOM(Virtual DOM)优化页面渲染性能,其核心流程分为以下几个关键步骤:
虚拟 DOM 的创建
React 组件通过 render() 方法或函数组件的返回值生成虚拟 DOM 树。虚拟 DOM 是轻量级的 JavaScript 对象,描述真实 DOM 的结构和属性。例如:
const element = <div className="title">Hello</div>;
// 转换为虚拟 DOM 对象类似:
// { type: 'div', props: { className: 'title', children: 'Hello' } }
Diff 算法比较差异
当状态或属性变化时,React 会重新生成新的虚拟 DOM 树,并通过 Diff 算法对比新旧虚拟 DOM 的差异。React 采用分层比较策略,仅对同一层级的节点进行比对,减少计算复杂度。
生成补丁(Patch)
Diff 算法会生成一个变更集合(称为 "patch"),记录需要更新的具体操作,例如:
- 节点属性更新(如
className变化) - 节点类型变化(如
div改为span) - 子节点的增删改
协调(Reconciliation)过程
React 将补丁应用到真实 DOM 上,这一过程称为协调。React 通过以下方式高效更新:
- 批量更新:合并多次状态变更,减少 DOM 操作次数。
- 按需更新:仅修改实际发生变化的部分,避免全量渲染。
关键 API 与生命周期
ReactDOM.render():入口方法,将虚拟 DOM 挂载到真实 DOM 节点。ReactDOM.render(<App />, document.getElementById('root'));useEffect或componentDidMount:在组件首次渲染后执行副作用操作(如 DOM 事件绑定)。
性能优化策略
- Keys 的使用:为列表项添加唯一
key,帮助 React 识别节点移动。{items.map(item => <li key={item.id}>{item.text}</li>)} React.memo或shouldComponentUpdate:避免不必要的重新渲染。
示例流程
假设有一个计数器组件:
function Counter() {
const [count, setCount] = useState(0);
return <button onClick={() => setCount(count + 1)}>{count}</button>;
}
- 首次渲染时,虚拟 DOM 转换为真实 DOM 按钮。
- 点击按钮后,状态变化触发新虚拟 DOM 生成。
- Diff 算法发现仅文本内容变化,仅更新按钮的
textContent属性。







