深入理解React 渲染机制

 更新时间:2026年07月05日 15:16:38   作者:Csvn  
React 作为当今最流行的前端框架之一,其高效的渲染机制是核心优势,本文就来详细的介绍一下React 渲染机制,感兴趣的可以了解一下

引言

React 作为当今最流行的前端框架之一,其高效的渲染机制是核心优势。理解 React 如何渲染 UI,对于性能优化至关重要。本文将深入探讨虚拟 DOM、Diff 算法、Fiber 架构以及完整的渲染流程。

虚拟 DOM 原理与优势

虚拟 DOM(Virtual DOM)是 React 的核心概念,它是一个轻量级的 JavaScript 对象,用来描述真实 DOM 的结构。

工作原理:

  1. 首次渲染时,React 创建虚拟 DOM 树并映射到真实 DOM
  2. 状态变化时,生成新的虚拟 DOM 树
  3. 通过 Diff 算法比较两棵树的差异
  4. 将最小变更应用到真实 DOM

核心优势:

  • 减少直接操作真实 DOM 的次数
  • 批量更新,提升性能
  • 跨平台能力(React Native 等)
// 虚拟 DOM 示例
const element = {
  type: 'div',
  props: {
    className: 'container',
    children: {
      type: 'h1',
      props: { children: 'Hello React' }
    }
  }
};

Diff 算法三大策略

React 的 Diff 算法通过三大策略将 O(n³) 复杂度优化到 O(n):

1. 同层比较

React 只比较同一层级的节点,不会跨层级比较。如果节点类型不同,直接销毁旧节点并创建新节点。

// 同层比较示例
// 旧树                    // 新树
<div>                     <div>
  <Component />             <Component />
</div>                    </div>
// ✅ 只比较 div 的子节点

2. 类型判断

节点类型相同时,复用节点;类型不同时,销毁重建。

// 类型相同 - 复用
<div className="old"> → <div className="new">

// 类型不同 - 重建
<div> → <span>  // 销毁 div,创建 span

3. Key 的作用

Key 帮助 React 识别哪些元素发生了变化,特别在列表渲染中至关重要。

// ❌ 不推荐 - 使用索引作为 key
{items.map((item, index) => (
  <li key={index}>{item.name}</li>
))}

// ✅ 推荐 - 使用唯一 ID
{items.map((item) => (
  <li key={item.id}>{item.name}</li>
))}

Fiber 架构详解

React 16 引入的 Fiber 架构解决了大规模组件树渲染阻塞的问题。

节点结构

每个 Fiber 节点包含:

  • type: 组件类型
  • props: 属性
  • return: 父节点
  • child: 子节点
  • sibling: 兄弟节点
  • effectTag: 副作用标记

双缓冲机制

Fiber 使用双缓冲(Double Buffering)技术:

  • current 树: 当前屏幕上显示的 Fiber 树
  • workInProgress 树: 正在构建的新 Fiber 树

渲染完成后,直接替换指针,实现快速切换。

任务优先级

Fiber 将渲染任务拆分为可中断的小单元,根据优先级调度:

优先级场景
Immediate用户输入、文本选择
UserBlocking点击、滚动
Normal网络请求、数据加载
Low分析上报
Idle后台任务

完整渲染流程

React 渲染分为两个阶段:

Render 阶段(可中断)

  1. 从根 Fiber 开始遍历
  2. 调用组件的 render 方法
  3. 比较新旧虚拟 DOM,标记变更
  4. 可被高优先级任务中断
// Render 阶段示例
function App() {
  const [count, setCount] = useState(0);
  return <button onClick={() => setCount(count + 1)}>{count}</button>;
}
// 点击时触发 Render 阶段

Commit 阶段(不可中断)

  1. 应用所有变更到真实 DOM
  2. 调用生命周期钩子(componentDidMount 等)
  3. 触发 useEffect 回调
  4. 必须同步完成,不可中断
Render 阶段 → 标记变更 → Commit 阶段 → 更新 DOM
    (可中断)                    (不可中断)

性能优化实践

1. 使用 React.memo

const MemoComponent = React.memo(({ data }) => {
  return <div>{data}</div>;
});
// 仅在 props 变化时重新渲染

2. 使用 useMemo 缓存计算结果

const expensiveValue = useMemo(() => {
  return computeExpensiveValue(a, b);
}, [a, b]);
// 依赖不变时复用缓存值

3. 使用 useCallback 缓存函数

const handleClick = useCallback(() => {
  doSomething(a, b);
}, [a, b]);
// 避免子组件因函数引用变化而重渲染

4. 列表渲染优化

// 虚拟列表 - 只渲染可见区域
import { FixedSizeList } from 'react-window';

<FixedSizeList
  height={500}
  itemCount={1000}
  itemSize={35}
>
  {({ index, style }) => (
    <div style={style}>Item {index}</div>
  )}
</FixedSizeList>

5. 代码分割

// 懒加载组件
const LazyComponent = React.lazy(() => import('./HeavyComponent'));

function App() {
  return (
    <Suspense fallback={<Loading />}>
      <LazyComponent />
    </Suspense>
  );
}

总结

React 渲染机制的核心要点:

  1. 虚拟 DOM 减少真实 DOM 操作,提升性能
  2. Diff 算法 通过同层比较、类型判断、Key 识别实现 O(n) 复杂度
  3. Fiber 架构 支持可中断渲染和任务优先级调度
  4. 双阶段渲染 Render 可中断,Commit 不可中断
  5. 性能优化 合理使用 memo、useMemo、useCallback 等工具

理解这些机制,能帮助我们在开发中做出更优的性能决策,构建流畅的用户体验。

到此这篇关于深入理解React 渲染机制的文章就介绍到这了,更多相关React 渲染机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Ant Design与Ant Design pro入门使用教程

    Ant Design与Ant Design pro入门使用教程

    Ant Design 是一个服务于企业级产品的设计体系,组件库是它的 React 实现,antd 被发布为一个 npm 包方便开发者安装并使用,这篇文章主要介绍了Ant Design与Ant Design pro入门,需要的朋友可以参考下
    2023-12-12
  • 解决react中useState状态异步更新的问题

    解决react中useState状态异步更新的问题

    本文主要介绍了react中useState状态异步更新的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 详解基于webpack搭建react运行环境

    详解基于webpack搭建react运行环境

    本篇文章主要介绍了详解基于webpack搭建react运行环境,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • react中使用antd及immutable示例详解

    react中使用antd及immutable示例详解

    这篇文章主要为大家介绍了react中使用antd及immutable示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • react render的原理及触发时机说明

    react render的原理及触发时机说明

    这篇文章主要介绍了react render的原理及触发时机说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • react native与webview通信的示例代码

    react native与webview通信的示例代码

    本篇文章主要介绍了react native与webview通信的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • React+TS+IntersectionObserver实现视频懒加载和自动播放功能

    React+TS+IntersectionObserver实现视频懒加载和自动播放功能

    通过本文的介绍,我们学习了如何使用 React + TypeScript 和 IntersectionObserver API 来实现一个视频播放控制组件,该组件具有懒加载功能,只有在用户滚动页面且视频进入视口时才开始下载视频资源,需要的朋友可以参考下
    2023-04-04
  • React Redux使用配置详解

    React Redux使用配置详解

    react-redux是redux官方react绑定库,能够使react组件从redux store中读取数据,并且向store分发actions以此来更新数据,这篇文章主要介绍了react-redux的设置,需要的朋友可以参考下
    2022-08-08
  • React事件机制源码解析

    React事件机制源码解析

    这篇文章主要介绍了React事件机制源码解析的相关资料,帮助大家更好的理解和学习使用React框架,感兴趣的朋友可以了解下
    2021-04-04
  • React Hook 四种组件优化总结

    React Hook 四种组件优化总结

    这篇文章主要介绍了React Hook四种组件优化总结,文章围绕主题展开详细的内容介绍,具有一定的参考价孩子,需要的朋友可以参考一下
    2022-07-07

最新评论