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 …...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...