当前位置: 首页 > news >正文

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 内部运行机制的核心,支撑了高效的渲染与更新流程。

相关文章:

React中createRoot函数原理解读——Element对象与Fiber对象、FiberRootNode与HostRootNode

【2024最新版】React18 核心源码分析教程&#xff08;全61集&#xff09; Element对象与Fiber对象 在 React 中&#xff0c;Element 对象 和 Fiber 对象 是核心概念&#xff0c;用于实现 React 的高效渲染和更新机制。以下是它们的详细解读&#xff1a; 1. Element 对象 定…...

利用Python实现Union-Find算法

Union-Find&#xff08;又称 并查集&#xff09;是一种高效解决 动态连通性问题 的算法。它主要提供两种操作&#xff1a; Union(x, y)&#xff1a;将元素 x 和 y 连接。Find(x)&#xff1a;找到元素 x 所属的集合的标识符&#xff08;通常是集合的根节点&#xff09;。 常用…...

【LeetCode: 912. 排序数组 + 归并排序】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…...

AI时代来了,我们不再需要IDE了

大家好&#xff0c;我是编程乐趣。 最近在思考一个问题&#xff0c;那就是AI这么强大。 未来有没有可能&#xff0c;我们就不需要不需要开发工具了&#xff0c;只需一个浏览器就可以开发软件了。 一、AI带来的变化 1、代码生成与补全 AI工具如GitHub Copilot等能够根据代码…...

PL/SQL语言的网络编程

PL/SQL语言的网络编程 引言 在信息化迅速发展的今天&#xff0c;网络编程作为现代软件开发的重要组成部分&#xff0c;受到了广泛关注。而在数据库管理系统中&#xff0c;Oracle 提供了 PL/SQL&#xff08;Procedural Language/Structured Query Language&#xff09;&#x…...

vue video重复视频 设置 srcObject 视频流不占用资源 减少资源浪费

// 直接设置srcObject减少获取视频流&#xff1a;通过 captureStream() 方法从下方视频元素获取视频流。 // 设置 srcObject&#xff1a;将获取到的视频流设置为上方视频的 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.找到要上传的文件&#xff0c;在目录内右键点击 5.依次执行命令 在命令窗口中输入&#xff1a;git init 复制仓库地址&#xff1a; 在命令窗口中输入&#xff1a;git remote add origin 仓库地址 在命令窗口中输入&#xff1a;…...

风水算命系统架构与功能分析

系统架构 服务端&#xff1a;Java&#xff08;最低JDK1.8&#xff0c;支持JDK11以及JDK17&#xff09;数据库&#xff1a;MySQL数据库&#xff08;标配5.7版本&#xff0c;支持MySQL8&#xff09;ORM框架&#xff1a;Mybatis&#xff08;集成通用tk-mapper&#xff0c;支持myb…...

Clojure语言的学习路线

Clojure语言的学习路线 Clojure是一种现代的Lisp方言&#xff0c;运行于Java虚拟机&#xff08;JVM&#xff09;上。它具备强大的函数式编程特性&#xff0c;支持并发和多线程编程&#xff0c;适合处理复杂的数据和计算任务。由于其简洁和灵活的语法&#xff0c;Clojure在数据…...

网络安全核心目标CIA

网络安全的核心目标是为关键资产提供机密性(Confidentiality)、可用性(Availablity)、完整性(Integrity)。作为安全基础架构中的主要的安全目标和宗旨&#xff0c;机密性、可用性、完整性频频出现&#xff0c;被简称为CIA&#xff0c;也被成为你AIC&#xff0c;只是顺序不同而已…...

Wi-Fi Direct (P2P)原理及功能介绍

目录 Wi-Fi Direct &#xff08;P2P&#xff09;介绍Wi-Fi Direct P2P 概述P2P-GO&#xff08;P2P Group Owner&#xff09;工作流程 wifi-Direct使用windows11 wifi-directOpenwrtwifi的concurrent mode Linux环境下的配置工具必联wifi芯片P2P支持REF Wi-Fi Direct &#xff…...

Perl语言的数据结构

Perl语言的数据结构 Perl是一种功能强大的、灵活的脚本语言&#xff0c;广泛用于文本处理、系统管理、网络编程以及许多其他领域。其灵活性不仅体现在语法上&#xff0c;还体现在其丰富的数据结构上。本文将深入探讨Perl的主要数据结构&#xff0c;包括标量、数组、哈希以及引…...

【MFC】设置CTreeCtrl单个节点的文字颜色

问题 功能调整需要依据不同状态设置树控件中单个节点的文字颜色。 分析 1、CTreeCtrl本身有设置文字颜色的接口SetTextColor&#xff0c;但是这个接口是设置树控件整体的文字颜色。 2、在自定义接口可以对树控件单个节点进行更新文字颜色和背景颜色&#xff0c;接收自定义绘制…...

【CSS】设置滚动条样式

文章目录 基本语法用法案例 基本语法 在CSS中&#xff0c;可以使用 ::-webkit-scrollbar 和相关伪元素来为滚动条设置样式&#xff0c;但请注意这些伪元素是非标准的&#xff0c;主要用于WebKit内核浏览器&#xff08;如Chrome、Safari&#xff09;。 ::-webkit-scrollbar CSS …...

Gitlab-Runner配置

原理 Gitlab-Runner是一个非常强大的CI/CD工具。它可以帮助我们自动化执行各种任务&#xff0c;如构建、测试和部署等。Gitlab-Runner和Gitlab通过API通信&#xff0c;接收作业并提交到执行队列&#xff0c;Gitlab-Runner从队列中获取作业&#xff0c;并允许在不同环境下进行作…...

代码随想录 哈希 test 8

18. 四数之和 - 力扣&#xff08;LeetCode&#xff09; 与三数之和类似&#xff0c;重点在剪枝和去重的区别&#xff0c;由于target可正可负&#xff0c;因此需要分两种情况讨论&#xff0c;如果target为正&#xff0c;则若当前选择的元素之和大于target&#xff0c;需要跳出这…...

[SAP ABAP] 使用LOOP AT...ASSIGNING FIELD-SYMBOL 直接更新内表数据

使用 LOOP AT...ASSIGNING FIELD-SYMBOL... 可以直接修改内表中的数据&#xff0c;而不需要先将内表数据复制到相应的工作区&#xff0c;然后再更新回内表中&#xff0c;从而提高性能 针对上述代码进行优化&#xff0c;我们使用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. 单词接龙

题目&#xff1a;127. 单词接龙 - 力扣&#xff08;LeetCode&#xff09; 先建立一颗trie树&#xff0c;从beginWord开始bfs&#xff1b;bfs的过程中&#xff0c;对trie树进行dfs寻找“只差一个字母”的其他未遍历到的字符串&#xff1b;直到bfs遍历到endWord。 struct Node …...

告别HDR格式混乱:用Python代码实战HLG与PQ曲线互转(附完整代码)

告别HDR格式混乱&#xff1a;用Python代码实战HLG与PQ曲线互转&#xff08;附完整代码&#xff09; 在视频处理领域&#xff0c;HDR&#xff08;高动态范围&#xff09;技术已经成为提升视觉体验的关键要素。然而&#xff0c;HLG&#xff08;Hybrid Log-Gamma&#xff09;和PQ&…...

从迷宫到N皇后:用Python手把手带你吃透BFS和DFS(附Educoder通关代码)

从迷宫到N皇后&#xff1a;用Python手把手带你吃透BFS和DFS&#xff08;附Educoder通关代码&#xff09; 在算法学习的道路上&#xff0c;BFS&#xff08;广度优先搜索&#xff09;和DFS&#xff08;深度优先搜索&#xff09;就像是一对性格迥异的双胞胎。一个喜欢稳扎稳打层层…...

从Excel到预测:5分钟搞定Python读取本地iris.csv文件并完成分类

从Excel到预测&#xff1a;5分钟搞定Python读取本地iris.csv文件并完成分类 当你第一次接触机器学习时&#xff0c;最令人沮丧的往往不是算法本身&#xff0c;而是那些看似简单却总出问题的数据准备环节。我至今记得自己对着一个简单的CSV文件折腾了整个下午的狼狈经历——列名…...

程序员的职场心态:如何应对代码bug和项目延期

在软件研发的全流程中&#xff0c;测试与开发如同孪生兄弟&#xff0c;紧密协作又时常因问题产生摩擦。作为软件测试从业者&#xff0c;我们既是bug的“捕手”&#xff0c;也是项目进度的“监督者”&#xff0c;更需要成为程序员职场心态的“理解者”与“协同者”。深入剖析程序…...

2026年降AI工具万方检测专项测试:五款工具万方AIGC检测通过率完整横评

2026年降AI工具万方检测专项测试&#xff1a;五款工具万方AIGC检测通过率完整横评 选工具之前做了一周功课&#xff0c;试用了三款&#xff0c;最后定了嘎嘎降AI&#xff08;www.aigcleaner.com&#xff09;。 4.8元&#xff0c;知网AI率从61%降到了5.3%&#xff0c;达标率99…...

【限时解密】Perplexity未公开的历史资料检索协议v2.3:仅开放给前500名深度用户的私有搜索语法手册

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Perplexity历史资料搜索的起源与协议演进脉络 Perplexity 作为面向知识密集型任务的下一代搜索代理&#xff0c;并非起源于传统搜索引擎架构&#xff0c;而是植根于大语言模型&#xff08;LLM&#xff09;推理…...

别只当题做!我把CTFshow Web信息搜集题(11-20)变成了真实漏洞挖掘指南

从CTF到实战&#xff1a;Web信息泄露漏洞的企业级攻防指南 当CTF技巧遇上真实世界 深夜两点&#xff0c;某电商平台的安全工程师收到告警——核心数据库正在被异常下载。溯源发现&#xff0c;攻击者竟是通过一个被遗忘的测试接口获取了服务器目录遍历权限。这个场景与CTFshow W…...

实习前自我培训-Day3学习

Day3学习–MySQL 企业开发使用方式 使用命令mysql -hip地址 -P端口号 -uroot -p来连接远程的数据库 数据模型关系型数据库&#xff1a;建立在关系模型基础上&#xff0c;由多张相互连接的二维表组成的数据库特点&#xff1a;使用表存储数据&#xff0c;格式同意&#xff0c;便于…...

ChipDNA PUF技术:从晶体管失配到硬件安全密钥的工程实践

1. 项目概述&#xff1a;当芯片拥有“DNA”&#xff0c;嵌入式安全进入新纪元在嵌入式系统设计领域&#xff0c;安全从来不是一个可以事后弥补的附加功能&#xff0c;而是必须从硬件层面开始构建的基石。随着物联网设备的爆炸式增长&#xff0c;从智能门锁到工业控制器&#xf…...

3分钟免费汉化Android Studio:社区中文语言包完整安装教程

3分钟免费汉化Android Studio&#xff1a;社区中文语言包完整安装教程 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本&#xff09; 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 还在为Andr…...