当前位置:首页 > React

react 如何渲染的

2026-01-15 09:52:47React

React 渲染机制

React 的渲染过程分为两个主要阶段:协调(Reconciliation)提交(Commit)。协调阶段负责计算差异(Diffing),提交阶段将变化应用到 DOM。

虚拟 DOM 的作用

React 使用虚拟 DOM 作为中间层,通过对比新旧虚拟 DOM 树的差异,最小化直接操作真实 DOM 的开销。虚拟 DOM 是一个轻量级的 JavaScript 对象,描述 UI 的结构和状态。

协调阶段的流程

  1. 生成虚拟 DOM 树
    组件通过 render 方法或函数组件的返回值生成虚拟 DOM 树。每次状态或属性变化时,会重新生成新的虚拟 DOM 树。

  2. Diffing 算法
    React 通过启发式算法(如按层级比较、Key 优化)对比新旧虚拟 DOM 树,找出需要更新的部分。算法的时间复杂度为 O(n)。

    • 元素类型不同:直接销毁旧子树,创建新子树。
    • 元素类型相同:递归比较子节点。
    • Key 属性:帮助 React 识别列表中元素的移动或重用。

提交阶段的流程

  1. 更新 DOM
    根据协调阶段的结果,React 调用 ReactDOM 或其他渲染器(如 React Native)的 API,将差异应用到真实 DOM。此阶段可能触发浏览器重绘或重排。

    react 如何渲染的

  2. 生命周期与副作用
    在提交阶段后,React 触发相关生命周期方法(如 componentDidMountcomponentDidUpdate)或 Hook 的副作用(如 useEffect)。

性能优化策略

  • 避免不必要的渲染
    使用 React.memoshouldComponentUpdate 跳过无变化的组件渲染。

  • 稳定的 Key
    列表渲染时使用唯一且稳定的 Key,避免因 Key 变化导致不必要的 DOM 操作。

    react 如何渲染的

  • 批量更新
    React 自动批量处理状态更新,减少渲染次数。异步场景可使用 ReactDOM.unstable_batchedUpdates(非正式 API)。

示例代码

function MyComponent({ data }) {
  // 生成虚拟 DOM
  return (
    <div>
      {data.map(item => (
        <ChildComponent key={item.id} item={item} />
      ))}
    </div>
  );
}

// 优化:跳过 props 未变化的渲染
const ChildComponent = React.memo(({ item }) => {
  return <div>{item.name}</div>;
});

公式说明

虚拟 DOM 的 Diffing 算法核心逻辑可简化为:

$$ \text{Diff}(V{\text{old}}, V{\text{new}}) = \text{PatchList} $$

其中:

  • $V_{\text{old}}$ 是旧虚拟 DOM 树。
  • $V_{\text{new}}$ 是新虚拟 DOM 树。
  • $\text{PatchList}$ 是应用到真实 DOM 的最小操作集合。

标签: react
分享给朋友:

相关文章

如何手写一个react

如何手写一个react

手写一个简单的 React 创建一个基础的 React 实现需要理解其核心概念:虚拟 DOM、组件、状态管理和渲染。以下是一个简化版的 React 实现。 创建虚拟 DOM 虚拟 DOM 是真实 D…

react架构如何

react架构如何

React 架构核心概念 React 的架构围绕组件化、虚拟 DOM 和单向数据流设计。组件是构建用户界面的独立模块,分为函数组件和类组件。虚拟 DOM 通过高效的 Diff 算法减少直接操作真实 D…

react 如何启动

react 如何启动

创建 React 项目 使用官方工具 create-react-app 快速初始化项目,需提前安装 Node.js(版本 ≥ 14.0.0)和 npm/yarn: npx create-react-…

react如何检测

react如何检测

检测 React 应用的方法 使用 PropTypes 进行类型检查 PropTypes 是 React 内置的类型检查工具,用于验证组件的 props 是否符合预期。在开发环境中,PropTypes…

react如何刷新

react如何刷新

刷新React组件的方法 使用状态更新触发重新渲染 通过更新组件的状态可以触发重新渲染。React会在状态变化时自动重新渲染组件。 const [count, setCount] = useStat…

react如何调度

react如何调度

React 调度机制概述 React 的调度机制通过 Fiber 架构 和 Scheduler 模块实现任务优先级管理与时间切片(Time Slicing),确保高优先级更新(如用户交互)能快速响应,…