React中createRoot函数原理解读——Element对象与Fiber对象、FiberRootNode与HostRootNode
【2024最新版】React18 核心源码分析教程(全61集)
Element对象与Fiber对象

在 React 中,Element 对象 和 Fiber 对象 是核心概念,用于实现 React 的高效渲染和更新机制。以下是它们的详细解读:
1. Element 对象
定义
React 的 Element 对象 是通过 React.createElement 或 JSX 创建的**描述 UI 的普通 JavaScript 对象**。
结构
一个典型的 React Element 对象的结构如下:
const element = {type: 'div', // 或者是组件函数/类,表示元素类型props: {children: [/* 子元素 */],className: 'example',},key: null, // 用于唯一标识(diff 算法优化)ref: null, // 用于获取组件实例或 DOM$$typeof: Symbol(react.element), // 用于区分是否是 React 元素
};

特点
- 不可变:React Element 是不可变的,描述的是 UI 的快照。
- 轻量:它是
UI 的描述,并不包含状态或方法。 - 静态描述:只表示渲染内容的静态信息,
真正的 DOM 操作由 Fiber 对象实现。
2. Fiber 对象
定义
Fiber 对象 是 React 16+ 引入的内部数据结构,用于管理组件的更新和渲染工作。
结构
一个 Fiber 对象的基本结构如下:
const fiber = {tag: 5, // 表示 Fiber 类型,比如函数组件、类组件、HostComponent(如 div)type: 'div', // 与 Element 的 type 对应key: null, // 用于唯一标识stateNode: DOM节点或类组件实例, // 当前 Fiber 的实际实例,DOM 节点或类组件实例child: Fiber, // 第一个子节点sibling: Fiber, // 下一个兄弟节点return: Fiber, // 父节点pendingProps: {}, // 本次更新的新 propsmemoizedProps: {}, // 上一次渲染的 propsmemoizedState: {}, // 上一次渲染的 stateeffectTag: 0, // 副作用标志,表示需要执行的操作类型nextEffect: null, // 下一个有副作用需要处理的 FiberupdateQueue: {}, // 存放 state 更新队列
};
特点
- 动态:Fiber 是 React 的工作单元,包含组件的状态、更新等动态信息。
- 链表结构:
Fiber 对象构成了一棵 Fiber 树。- 每个 Fiber 节点通过
child、sibling和return连接。
- 与 Element 不同的职责:
- Element 是静态描述,Fiber 负责调度和计算实际的 UI 变化。
- Fiber 引入了时间切片机制,
支持任务中断和优先级调度。
- 双缓存机制:
- React 使用两棵 Fiber 树(
current和workInProgress)来实现双缓存,减少不必要的 DOM 操作。
- React 使用两棵 Fiber 树(
3. Element 和 Fiber 的关系
| 特性 | Element 对象 | Fiber 对象 |
|---|---|---|
| 职责 | 描述 UI | 管理组件状态、更新任务和渲染 |
| 生成 | 由 React.createElement 创建 | 由 React 调度和渲染过程生成 |
| 结构 | 轻量、不可变的 JS 对象 | 复杂、包含状态和关系的动态对象 |
| 生命周期 | 创建后一直存在,描述 UI 快照 | 每次渲染会重新生成或复用 |
| 关系 | 是 Fiber 的静态输入 | 是 Element 的动态实现 |
4. Fiber 的核心功能
调度更新任务:通过优先级控制任务的执行,允许任务中断。状态管理:保存组件的状态和属性,管理setState。DOM 更新:对比新旧 Fiber 树,生成最小更新路径(Diff 算法)。副作用管理:通过effectTag管理 DOM 操作、生命周期回调等。
5. 总结
- React Element 是 UI 的静态描述,简单且不可变。
- Fiber 是 React 内部的工作单元,负责处理状态、调度更新和渲染。
Fiber 的引入是 React 性能优化的关键,尤其是在构建复杂的 UI 和实现时间切片时。Element 和 Fiber 分工明确,共同构建了 React 的高效渲染机制。
FiberRootNode与HostRootFiber

在 React 的内部实现中,HostRootFiber 和 FiberRootNode 是 React 核心中的两个重要概念,分别与 Fiber 树的根节点和渲染树的管理密切相关。以下是对这两个概念的详细解析。
1. FiberRootNode
定义
FiberRootNode是 React 的根容器节点,用于管理整个应用的 Fiber 树和渲染环境。- 它是 React 应用的真正入口点,通常与宿主环境(如
DOM或React Native)的根容器绑定。
作用
- 管理宿主环境的渲染目标:
- 保存与宿主环境相关的信息(如 DOM 容器)。
- 对应浏览器中的根节点(如
document.getElementById('root'))。
- 控制 Fiber 树的生命周期:
- 通过
current字段管理当前正在渲染的 Fiber 树。 - 配合
双缓存机制,切换current和workInProgress。
- 通过
存储调度信息:- 保存任务的优先级(如时间切片相关)。
- 存储更新队列和渲染进度。
结构
FiberRootNode 的典型结构如下:
const fiberRootNode = {containerInfo: DOMContainer, // 宿主环境的根容器,如 DOM 节点current: HostRootFiber, // 当前的根 FiberfinishedWork: null, // 已完成的 Fiber 树pendingLanes: 0, // 表示待处理更新的优先级队列eventTimes: [], // 记录事件触发时间,用于调度优化callbackNode: null, // 当前调度的回调函数callbackPriority: NoPriority, // 当前调度的优先级
};
2. HostRootFiber
定义
HostRootFiber是 React 应用的Fiber 树的根节点。- 它对应于 React 渲染树的入口点,表示整个应用的根。
作用
- 承载应用的 Fiber 树:整个应用的组件树从
HostRootFiber开始构建,作为 Fiber 树的根节点。 - 关联 Fiber 树与渲染器:它是连接 Fiber 树与 DOM(或其他宿主环境,如 React Native)之间的桥梁。
- 管理应用状态:
HostRootFiber保存整个应用的状态(如pendingProps和memoizedState)。updateQueue中记录了根节点的更新任务队列。
结构
HostRootFiber 是一个特殊的 Fiber 节点,具有以下字段:
const hostRootFiber = {tag: HostRoot, // Fiber 类型标记,表示是 HostRootstateNode: FiberRootNode, // 指向 FiberRootNode 实例child: Fiber, // 子节点,指向应用的第一个组件(如 <App />)pendingProps: {}, // 本次更新传入的 propsmemoizedProps: {}, // 已保存的 propsmemoizedState: {}, // 当前组件状态updateQueue: {}, // 存储更新任务的队列alternate: WorkInProgressFiber, // 指向 workInProgress Fiber,用于双缓存机制
};

3.FiberRootNode 与 HostRootFiber 的关系
| 特性 | HostRootFiber | FiberRootNode |
|---|---|---|
| 定义 | Fiber 树的根节点,代表 React 树的逻辑入口 | React 根容器,管理 Fiber 树与宿主环境 |
| 存储内容 | 应用的根组件和状态(App 的入口) | 宿主环境信息(如 DOM 容器)和调度状态 |
| 连接关系 | 通过 stateNode 引用 FiberRootNode | 通过 current 引用 HostRootFiber |
| 用途 | 描述 Fiber 树的根 | 管理整个应用的渲染和更新机制 |
| 生命周期 | 每次更新会创建新的 workInProgress 副本 | 始终存在,贯穿应用生命周期 |
4. 运行机制中的作用
-
初始化时:
- React 创建
FiberRootNode并将HostRootFiber挂载到FiberRootNode的current属性上。 containerInfo保存宿主环境的信息。
- React 创建
-
更新时:
- 更新会从
HostRootFiber开始,React 使用双缓存机制创建workInProgress树。 - 在
调和过程中,React 通过FiberRootNode调度任务,确保高优先级任务优先完成。
- 更新会从
-
渲染完成:
- 当 Fiber 树完成渲染(即
finishedWork不为null),React 将FiberRootNode.current切换到新的 Fiber 树。
- 当 Fiber 树完成渲染(即
5. 总结
FiberRootNode是管理上的根节点,负责协调 Fiber 树和宿主环境之间的关系。HostRootFiber是逻辑上的根节点,描述了 React 树的结构。
它们的协作是 React 内部运行机制的核心,支撑了高效的渲染与更新流程。
相关文章:
React中createRoot函数原理解读——Element对象与Fiber对象、FiberRootNode与HostRootNode
【2024最新版】React18 核心源码分析教程(全61集) Element对象与Fiber对象 在 React 中,Element 对象 和 Fiber 对象 是核心概念,用于实现 React 的高效渲染和更新机制。以下是它们的详细解读: 1. Element 对象 定…...
利用Python实现Union-Find算法
Union-Find(又称 并查集)是一种高效解决 动态连通性问题 的算法。它主要提供两种操作: Union(x, y):将元素 x 和 y 连接。Find(x):找到元素 x 所属的集合的标识符(通常是集合的根节点)。 常用…...
【LeetCode: 912. 排序数组 + 归并排序】
🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...
AI时代来了,我们不再需要IDE了
大家好,我是编程乐趣。 最近在思考一个问题,那就是AI这么强大。 未来有没有可能,我们就不需要不需要开发工具了,只需一个浏览器就可以开发软件了。 一、AI带来的变化 1、代码生成与补全 AI工具如GitHub Copilot等能够根据代码…...
PL/SQL语言的网络编程
PL/SQL语言的网络编程 引言 在信息化迅速发展的今天,网络编程作为现代软件开发的重要组成部分,受到了广泛关注。而在数据库管理系统中,Oracle 提供了 PL/SQL(Procedural Language/Structured Query Language)&#x…...
vue video重复视频 设置 srcObject 视频流不占用资源 减少资源浪费
// 直接设置srcObject减少获取视频流:通过 captureStream() 方法从下方视频元素获取视频流。 // 设置 srcObject:将获取到的视频流设置为上方视频的 srcObject 减少资源浪费 // 获取到需要复制到的dom元素 const firstVideoElement proxy.$refs.firs…...
JavaFx 21 项目Markdown 预览、编辑、新建、文件树、删除、重命名
项目文件结构 项目的源代码和资源文件存放在以下路径: 源代码: src/main/java/com/kong/markdown/ 包含多个 Java 文件,主要实现了应用的功能: App.java:主类,可能包含应用的启动逻辑。FileService.java:可能与文件操作相关的服务类。MainController.java:控制器类,可…...
git项目提交步骤(简洁版)
1.创建仓库 2.填写 信息 3.点击这个按钮 4.找到要上传的文件,在目录内右键点击 5.依次执行命令 在命令窗口中输入:git init 复制仓库地址: 在命令窗口中输入:git remote add origin 仓库地址 在命令窗口中输入:…...
风水算命系统架构与功能分析
系统架构 服务端:Java(最低JDK1.8,支持JDK11以及JDK17)数据库:MySQL数据库(标配5.7版本,支持MySQL8)ORM框架:Mybatis(集成通用tk-mapper,支持myb…...
Clojure语言的学习路线
Clojure语言的学习路线 Clojure是一种现代的Lisp方言,运行于Java虚拟机(JVM)上。它具备强大的函数式编程特性,支持并发和多线程编程,适合处理复杂的数据和计算任务。由于其简洁和灵活的语法,Clojure在数据…...
网络安全核心目标CIA
网络安全的核心目标是为关键资产提供机密性(Confidentiality)、可用性(Availablity)、完整性(Integrity)。作为安全基础架构中的主要的安全目标和宗旨,机密性、可用性、完整性频频出现,被简称为CIA,也被成为你AIC,只是顺序不同而已…...
Wi-Fi Direct (P2P)原理及功能介绍
目录 Wi-Fi Direct (P2P)介绍Wi-Fi Direct P2P 概述P2P-GO(P2P Group Owner)工作流程 wifi-Direct使用windows11 wifi-directOpenwrtwifi的concurrent mode Linux环境下的配置工具必联wifi芯片P2P支持REF Wi-Fi Direct ÿ…...
Perl语言的数据结构
Perl语言的数据结构 Perl是一种功能强大的、灵活的脚本语言,广泛用于文本处理、系统管理、网络编程以及许多其他领域。其灵活性不仅体现在语法上,还体现在其丰富的数据结构上。本文将深入探讨Perl的主要数据结构,包括标量、数组、哈希以及引…...
【MFC】设置CTreeCtrl单个节点的文字颜色
问题 功能调整需要依据不同状态设置树控件中单个节点的文字颜色。 分析 1、CTreeCtrl本身有设置文字颜色的接口SetTextColor,但是这个接口是设置树控件整体的文字颜色。 2、在自定义接口可以对树控件单个节点进行更新文字颜色和背景颜色,接收自定义绘制…...
【CSS】设置滚动条样式
文章目录 基本语法用法案例 基本语法 在CSS中,可以使用 ::-webkit-scrollbar 和相关伪元素来为滚动条设置样式,但请注意这些伪元素是非标准的,主要用于WebKit内核浏览器(如Chrome、Safari)。 ::-webkit-scrollbar CSS …...
Gitlab-Runner配置
原理 Gitlab-Runner是一个非常强大的CI/CD工具。它可以帮助我们自动化执行各种任务,如构建、测试和部署等。Gitlab-Runner和Gitlab通过API通信,接收作业并提交到执行队列,Gitlab-Runner从队列中获取作业,并允许在不同环境下进行作…...
代码随想录 哈希 test 8
18. 四数之和 - 力扣(LeetCode) 与三数之和类似,重点在剪枝和去重的区别,由于target可正可负,因此需要分两种情况讨论,如果target为正,则若当前选择的元素之和大于target,需要跳出这…...
[SAP ABAP] 使用LOOP AT...ASSIGNING FIELD-SYMBOL 直接更新内表数据
使用 LOOP AT...ASSIGNING FIELD-SYMBOL... 可以直接修改内表中的数据,而不需要先将内表数据复制到相应的工作区,然后再更新回内表中,从而提高性能 针对上述代码进行优化,我们使用LOOP AT...ASSIGNING FIELD-SYMBOL 直接更新内表数…...
MySQL数据导出导入
一、数据导出 1.导出全库备份到本地的目录 mysqldump -u$USER -p$PASSWD -h127.0.0.1 -P3306 --routines--default-character-setutf8 --lock-all-tables --add-drop-database -A >db.all.sql 2.导出指定库到本地的目录(例如mysql库) mysqldump -u$USER -p$PASSWD -h127.…...
leetcode 127. 单词接龙
题目:127. 单词接龙 - 力扣(LeetCode) 先建立一颗trie树,从beginWord开始bfs;bfs的过程中,对trie树进行dfs寻找“只差一个字母”的其他未遍历到的字符串;直到bfs遍历到endWord。 struct Node …...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
