当前位置:首页 > 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 版本 运行以下命令查看项目中安装的 React 版本: npm list react 更新 React 及相关依赖 通过 npm 或 yarn…

如何选购react

如何选购react

选购 React 相关产品或服务的建议 React 是一个用于构建用户界面的 JavaScript 库,广泛应用于前端开发。以下是选购 React 相关产品(如课程、书籍、工具、组件库等)的参考方法:…

react如何读

react如何读

React 的发音 React 的发音为 /riˈækt/(音标),读作“瑞-艾克特”。其中: “Re” 发音类似英文单词 “read” 的开头部分。 “act” 发音与英文单词 “act” 一致。…

react如何同步

react如何同步

React 同步状态管理方法 在 React 中实现同步状态管理,可以通过以下多种方式实现: 使用 useState 和 useEffect 钩子 通过 useState 定义状态,使用 useEf…

react如何切换class

react如何切换class

动态切换 React 组件的类名 在 React 中动态切换类名可以通过多种方式实现,以下是常见的几种方法: 使用模板字符串和状态管理 function MyComponent() {…

react如何获取路由

react如何获取路由

获取当前路由路径 在React中获取当前路由路径可以通过react-router-dom提供的useLocation钩子。useLocation返回一个包含当前路由信息的对象,其中pathname属性…