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 元素
};

在这里插入图片描述

特点
  1. 不可变:React Element 是不可变的,描述的是 UI 的快照。
  2. 轻量:它是 UI 的描述,并不包含状态或方法
  3. 静态描述:只表示渲染内容的静态信息,真正的 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 更新队列
};
特点
  1. 动态:Fiber 是 React 的工作单元,包含组件的状态、更新等动态信息。
  2. 链表结构
    • Fiber 对象构成了一棵 Fiber 树
    • 每个 Fiber 节点通过 childsiblingreturn 连接。
  3. 与 Element 不同的职责
    • Element 是静态描述,Fiber 负责调度和计算实际的 UI 变化。
    • Fiber 引入了时间切片机制,支持任务中断和优先级调度
  4. 双缓存机制
    • React 使用两棵 Fiber 树(currentworkInProgress来实现双缓存,减少不必要的 DOM 操作。

3. Element 和 Fiber 的关系

特性Element 对象Fiber 对象
职责描述 UI管理组件状态、更新任务和渲染
生成React.createElement 创建由 React 调度和渲染过程生成
结构轻量、不可变的 JS 对象复杂、包含状态和关系的动态对象
生命周期创建后一直存在,描述 UI 快照每次渲染会重新生成或复用
关系是 Fiber 的静态输入是 Element 的动态实现

4. Fiber 的核心功能

  1. 调度更新任务:通过优先级控制任务的执行,允许任务中断。
  2. 状态管理:保存组件的状态和属性,管理 setState
  3. DOM 更新:对比新旧 Fiber 树,生成最小更新路径(Diff 算法)。
  4. 副作用管理:通过 effectTag 管理 DOM 操作、生命周期回调等。

5. 总结

  • React Element 是 UI 的静态描述,简单且不可变。
  • Fiber 是 React 内部的工作单元,负责处理状态、调度更新和渲染。

Fiber 的引入是 React 性能优化的关键,尤其是在构建复杂的 UI 和实现时间切片时。Element 和 Fiber 分工明确,共同构建了 React 的高效渲染机制。

FiberRootNode与HostRootFiber

在这里插入图片描述
在 React 的内部实现中,HostRootFiberFiberRootNode 是 React 核心中的两个重要概念,分别与 Fiber 树的根节点和渲染树的管理密切相关。以下是对这两个概念的详细解析。

1. FiberRootNode

定义
  • FiberRootNode 是 React 的根容器节点,用于管理整个应用的 Fiber 树和渲染环境
  • 它是 React 应用的真正入口点,通常与宿主环境(如 DOMReact Native)的根容器绑定
作用
  1. 管理宿主环境的渲染目标
    • 保存与宿主环境相关的信息(如 DOM 容器)。
    • 对应浏览器中的根节点(如 document.getElementById('root'))。
  2. 控制 Fiber 树的生命周期
    • 通过 current 字段管理当前正在渲染的 Fiber 树。
    • 配合双缓存机制,切换 currentworkInProgress
  3. 存储调度信息
    • 保存任务的优先级(如时间切片相关)。
    • 存储更新队列和渲染进度
结构

FiberRootNode 的典型结构如下:

const fiberRootNode = {containerInfo: DOMContainer, // 宿主环境的根容器,如 DOM 节点current: HostRootFiber, // 当前的根 FiberfinishedWork: null, // 已完成的 Fiber 树pendingLanes: 0, // 表示待处理更新的优先级队列eventTimes: [], // 记录事件触发时间,用于调度优化callbackNode: null, // 当前调度的回调函数callbackPriority: NoPriority, // 当前调度的优先级
};

2. HostRootFiber

定义
  • HostRootFiber 是 React 应用的 Fiber 树的根节点
  • 它对应于 React 渲染树的入口点,表示整个应用的根。
作用
  1. 承载应用的 Fiber 树:整个应用的组件树从 HostRootFiber 开始构建,作为 Fiber 树的根节点。
  2. 关联 Fiber 树与渲染器:它是连接 Fiber 树与 DOM(或其他宿主环境,如 React Native)之间的桥梁。
  3. 管理应用状态
    • HostRootFiber 保存整个应用的状态(如 pendingPropsmemoizedState)。
    • 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 的关系

特性HostRootFiberFiberRootNode
定义Fiber 树的根节点,代表 React 树的逻辑入口React 根容器,管理 Fiber 树与宿主环境
存储内容应用的根组件和状态(App 的入口)宿主环境信息(如 DOM 容器)和调度状态
连接关系通过 stateNode 引用 FiberRootNode通过 current 引用 HostRootFiber
用途描述 Fiber 树的根管理整个应用的渲染和更新机制
生命周期每次更新会创建新的 workInProgress 副本始终存在,贯穿应用生命周期

4. 运行机制中的作用

  1. 初始化时

    • React 创建 FiberRootNode 并将 HostRootFiber 挂载到 FiberRootNodecurrent 属性上。
    • containerInfo 保存宿主环境的信息。
  2. 更新时

    • 更新会从 HostRootFiber 开始,React 使用双缓存机制创建 workInProgress 树。
    • 调和过程中,React 通过 FiberRootNode 调度任务,确保高优先级任务优先完成
  3. 渲染完成

    • 当 Fiber 树完成渲染(即 finishedWork 不为 null),React 将 FiberRootNode.current 切换到新的 Fiber 树。

5. 总结

  • FiberRootNode 是管理上的根节点,负责协调 Fiber 树和宿主环境之间的关系。
  • HostRootFiber 是逻辑上的根节点,描述了 React 树的结构。

它们的协作是 React 内部运行机制的核心,支撑了高效的渲染与更新流程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/661.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何用SQL语句来查询表或索引的行存/列存存储方式|OceanBase 用户问题集锦

一、问题背景 自OceanBase 4.3.0版本起&#xff0c;支持了列存引擎&#xff0c;允许表和索引以行存、纯列存或行列冗余的形式创建&#xff0c;且这些存储方式可以自由组合。除了使用 show create table命令来查看表和索引的存储类型外&#xff0c;也有用户询问如何通过SQL语句…

超完整Docker学习记录,Docker常用命令详解

前言 关于国内拉取不到docker镜像的问题&#xff0c;可以利用Github Action将需要的镜像转存到阿里云私有仓库&#xff0c;然后再通过阿里云私有仓库去拉取就可以了。 参考项目地址&#xff1a;使用Github Action将国外的Docker镜像转存到阿里云私有仓库 一、Docker简介 Do…

数据结构-排序课后题

今天我们来简单的说说关于排序的一些课后练习题. 对应的知识点博客: LINK. 目录 1. 每一单趟都能确定一个数字的最终位置的排序2. 根据序列变化确定排序方式3. 排序顺序对哪些排序效率影响不大?4. 对有序序列排序最费力的排序方式是什么?5. 对接近有序序列排序最快的排序方式…

MySQL 架构

MySQL架构 MySQL8.0服务器是由连接池、服务管理⼯具和公共组件、NoSQL接⼝、SQL接⼝、解析器、优化 器、缓存、存储引擎、⽂件系统组成。MySQL还为各种编程语⾔提供了⼀套⽤于外部程序访问服务器的连接器。整体架构图如下所⽰&#xff1a; MySQL Connectors&#xff1a;为使⽤…

【数据结构】二叉搜索树

目录 1. 二叉搜索树的概念 2. 二叉搜索树的性能分析 3.二叉搜索树的实现 3. 1.二叉搜索树的插入 3.2. 二叉搜索树的查找 3.3. 二叉搜索树的删除 3.4. 二叉搜索树的实现代码 4. 二叉搜索树key和key/value两种使用场景 4.1 key搜索场景&#xff1a; 4.2 key/value搜索场…

【C++】string的关系运算与比较分析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;基础知识&#xff1a;C 中的 string 关系运算器1. 关系运算器概述2. 字符串比较的本质 &#x1f4af;代码解析与扩展代码例一&#xff1a;相等比较代码解析输出 代码例二&a…

高性能网络模式:Reactor 和 Proactor

Reactor Reactor 采用I/O多路复用监听事件&#xff0c;收到事件后&#xff0c;根据事件类型分配给某个进程/线程。 实际应用中用到的模型&#xff1a; 单 Reactor 单进程 单 Reactor 多线程 优点&#xff1a;能充分利用多核CPU性能。 缺点&#xff1a;存在多线程竞争共享资源…

有限元分析学习——Anasys Workbanch第一阶段笔记(10)桌子载荷案例分析_实际载荷与均布载荷的对比

目录 0 序言 1 桌子案例 2 模型简化 3 方案A 前处理 1&#xff09;分析类型选择 2&#xff09;材料加载 3&#xff09;约束、载荷及接触 4&#xff09;控制网格(网格大小需要根据结果不断调整) 初始计算结果 加密后计算结果 4 方案B、C 前处理 1&#xff09;分析…

用HTML + CSS实现太极图

目录 一、效果图 二、实现思路 三、完整代码 四、总结 一、效果图 如图所示&#xff0c;太极图一半为黑色&#xff08;代表阴&#xff09;&#xff0c;另一半为白色&#xff08;代表阳&#xff09;。这两部分相互环绕&#xff0c;形成一种流动的、旋转的感觉。 二、实现思…

【Rust自学】11.7. 按测试的名称运行测试

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 11.7.1. 按名称运行测试的子集 如果想要选择运行的测试&#xff0c;就将测试的名称&#xff08;一个或多个&#xff09;作为cargo test的…

标准应用 | 2025年网络安全服务成本度量实施参考

01 网络安全服务成本度量依据相关新变化 为了解决我国网络安全服务产业发展中面临的服务供需两方对于服务成本组成认知偏差较大、网络安全服务成本度量缺乏依据的问题&#xff0c;中国网络安全产业联盟&#xff08;CCIA&#xff09;组织北京赛西科技发展有限责任公司、北京安…

HAMi + prometheus-k8s + grafana实现vgpu虚拟化监控

最近长沙跑了半个多月&#xff0c;跟甲方客户对了下项目指标&#xff0c;许久没更新 回来后继续研究如何实现 grafana实现HAMi vgpu虚拟化监控&#xff0c;毕竟合同里写了需要体现gpu资源限制和算力共享以及体现算力卡资源共享监控 先说下为啥要用HAMi吧&#xff0c; 一个重要原…

某地武警海警总队建筑物自动化监测

1. 项目概述 该项目分布于三个不同的地级市&#xff0c;都是位于临海港口的码头&#xff0c;由中国武警海警总队驻扎&#xff0c;守卫人民安全。 1号建筑物自动化监测系统项目由一道伸缩缝划分为两个监测单元&#xff0c;建筑物为三层混合结构&#xff0c;采用350mm厚石墙、2…

负载均衡原理及算法

什么是负载均衡&#xff1f; 负载均衡 指的是将用户请求分摊到不同的服务器上处理&#xff0c;以提高系统整体的并发处理能力以及可靠性。负载均衡服务可以有由专门的软件或者硬件来完成&#xff0c;一般情况下&#xff0c;硬件的性能更好&#xff0c;软件的价格更便宜&#x…

Windows 下Mamba2 / Vim / Vmamba 环境安装问题记录及解决方法终极版(无需绕过triton)

导航 安装教程导航 Mamba 及 Vim 安装问题参看本人博客&#xff1a;Mamba 环境安装踩坑问题汇总及解决方法&#xff08;初版&#xff09;Linux 下Mamba 及 Vim 安装问题参看本人博客&#xff1a;Mamba 环境安装踩坑问题汇总及解决方法&#xff08;重置版&#xff09;Windows …

LLMs之VDB:LanceDB的简介、安装和使用方法、案例应用之详细攻略

LLMs之VDB&#xff1a;LanceDB的简介、安装和使用方法、案例应用之详细攻略 目录 LanceDB的简介 1、LanceDB的主要特性 2、为何选择 LanceDB&#xff1f; LanceDB的安装和使用方法 1、安装方法 Javascript/Typescript Python 2、使用方法 Javascript Python LanceDB…

《拉依达的嵌入式\驱动面试宝典》—计算机网络篇(二)

《拉依达的嵌入式\驱动面试宝典》—计算机网络篇(二) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《…

Java面试核心知识4

公平锁与非公平锁 公平锁&#xff08;Fair&#xff09; 加锁前检查是否有排队等待的线程&#xff0c;优先排队等待的线程&#xff0c;先来先得 非公平锁&#xff08;Nonfair&#xff09; 加锁时不考虑排队等待问题&#xff0c;直接尝试获取锁&#xff0c;获取不到自动到队尾…

探索AGI:智能助手与自我赋能的新时代

目录 1 AGI1.1 DeepMind Levels&#xff08;2023年11月)1.2 OpenAI Levels&#xff08;2024年7月&#xff09;1.3 对比与总结1.4 AGI可能诞生哪里 2 基于AI的智能自动化助手2.1 通用型大模型2.2 专业的Agent和模型工具开发框架2.3 编程与代码生成助手2.4 视频和多模态生成2.5 商…

python迷宫寻宝 第4关 自动寻路(找宝箱、宝石、终点、获取企鹅信息)

目录 地图 ​编辑 1、成功获取粉宝石或黄宝石。 2、获取企鹅的信息 3、获取红宝石 (1)api.get.item获取红宝石 (2)context.items获取红宝石 4、获取宝箱 &#xff08;1&#xff09;api.get.item获取宝箱 &#xff08;2&#xff09;context.items获取宝箱 5、达到终点 …