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

news2025/1/10 19:25:47

【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: {}, // 本次更新的新 props
  memoizedProps: {}, // 上一次渲染的 props
  memoizedState: {}, // 上一次渲染的 state
  effectTag: 0, // 副作用标志,表示需要执行的操作类型
  nextEffect: null, // 下一个有副作用需要处理的 Fiber
  updateQueue: {}, // 存放 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, // 当前的根 Fiber
  finishedWork: 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 类型标记,表示是 HostRoot
  stateNode: FiberRootNode, // 指向 FiberRootNode 实例
  child: Fiber, // 子节点,指向应用的第一个组件(如 <App />)
  pendingProps: {}, // 本次更新传入的 props
  memoizedProps: {}, // 已保存的 props
  memoizedState: {}, // 当前组件状态
  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.coloradmin.cn/o/2274512.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

急速了解什么是GPU服务器

GPU服务器是一种专门配置了高性能图形处理器&#xff08;GPU&#xff09;的服务器&#xff0c;旨在提供高性能计算、深度学习、科学计算等多种场景的计算服务。与传统的CPU服务器相比&#xff0c;GPU服务器在处理并行密集型计算任务时具有显著优势。本文将详细介绍GPU服务器的定…

一.MySQL程序简介

整体介绍 1.服务端mysqld(可执行文件) mysqld --verbose --help 2.客户端mysql(可执行文件) 3.其它工具包程序

腾讯云AI代码助手编程挑战赛-凯撒密码解码编码器

作品简介 在CTFer选手比赛做crypto的题目时&#xff0c;一些题目需要自己去解密&#xff0c;但是解密的工具大部分在线上&#xff0c;而在比赛过程中大部分又是无网环境&#xff0c;所以根据要求做了这个工具 技术架构 python语言的tk库来完成的GUI页面设计&#xff0c;通过…

深度学习第三弹:python入门与线性表示代码

一、python入门 1.熟悉基础数据结构——整型数据&#xff0c;浮点型数据&#xff0c;列表&#xff0c;字典&#xff0c;字符串&#xff1b;了解列表及字典的切片&#xff0c;插入&#xff0c;删除操作。 list1 [1, 2, 3, 4, 5] for each in list1:print(each) print(list1[1…

常见的端口号大全,2025年整理

端口号是网络通信的基础&#xff0c;它定义了不同服务的入口和出口。了解服务端口号不仅有助于网络配置&#xff0c;还能提升问题排查效率。在实际应用中&#xff0c;熟悉常见端口号可以帮助你快速定位网络故障、优化服务性能&#xff0c;并确保网络安全。 一、常见的网络服务…

Android adb shell GPU信息

Android adb shell GPU信息 先 adb shell 进入控制台。 然后&#xff1a; dumpsys | grep GLES Android adb shell命令捕获systemtrace_android 抓trace-CSDN博客文章浏览阅读2.5k次&#xff0c;点赞2次&#xff0c;收藏8次。本文介绍了如何使用adbshell命令配合perfetto工…

【LeetCode】力扣刷题热题100道(21-25题)附源码 接雨水 合并区间 字母异位词 滑动窗口 覆盖子串(C++)

目录 1.接雨水 2.合井区间 3.找到字符串中所有字母异位词 4.滑动窗口最大值 5.最小覆盖子串 1.接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 代码如下所示&#xff1a; class Solution {…

01-51单片机LED与独立按键

一、单片机概述 注意&#xff1a;个人学习笔记&#xff0c;里面涉及到的C语言和进程转换相关的知识在C语言部分已经写了&#xff0c;这里是默认都会的状态学习单片机。 1.什么是单片机 单片机&#xff0c;英文Micro Controller Unit&#xff0c;简称MCU。其内部集成了CPU、R…

Linux内核编程(二十一)USB应用及驱动开发

一、基础知识 1. USB接口是什么&#xff1f; USB接口&#xff08;Universal Serial Bus&#xff09;是一种通用串行总线&#xff0c;广泛使用的接口标准&#xff0c;主要用于连接计算机与外围设备&#xff08;如键盘、鼠标、打印机、存储设备等&#xff09;之间的数据传输和电…

ModelScope创空间使用

文章目录 前言 一、ModelScope是什么&#xff1f; 二、使用步骤 1.注册ModelScope 2.新建创空间 3.创空间基本说明 4.部署创空间 5.访问创空间 三、其他补充说明 总结 前言 随着AI大模型的应用越来越广泛&#xff0c;模型应用部署的需求也越来越多&#xff0c;包括h…

记1(监督学习+一元线性回归

目录 1、基础概念2、一元线性回归 1、基础概念 机器学习&#xff08;Machine Learning&#xff09;&#xff1a;通过学习算法从数据中学习模型的过程 例如从“房价y~面积x”的关系中学习&#xff1a; 建立模型&#xff1a;ywxb 学习模型&#xff1a;确定w&#xff0c;b&#x…

服务器双网卡NCCL通过交换机通信

1、NCCL变量设置 export CUDA_DEVICE_MAX_CONNECTIONS1 export NCCL_SOCKET_IFNAMEeno2 export NCCL_IB_DISABLE0 #export NCCL_NETIB export NCCL_IB_HCAmlx5_0,mlx5_1 export NCCL_IB_GID_INDEX3 export NCCL_DEBUGINFOGPUS_PER_NODE4MASTER_ADDR192.168.1.2 MASTER_PORT600…

PySide6 Qt for Python Qt Quick参考网址

Qt QML BOOK&#xff1a; 《Qt for Python》 -Building an Application https://www.qt.io/product/qt6/qml-book/ch19-python-build-app#signals-and-slots Qt for Python&#xff1a;与C版本的差异即BUG处理&#xff08;常见的DLL文件确实的问题等&#xff09; Qt for Pyt…

NineData云原生智能数据管理平台新功能发布|2024年12月版

本月发布 7 项更新&#xff0c;其中重点发布 2 项、功能优化 5 项。 重点发布 数据库 Devops - Oracle 非表对象支持可视化创建与管理 Oracle 非表对象&#xff0c;包括视图&#xff08;View&#xff09;、包&#xff08;Package&#xff09;、存储过程&#xff08;Procedur…

【Elasticsearch7.11】postman批量导入少量数据

JSON 文件内的数据格式&#xff0c;json文件数据条数不要过多&#xff0c;会请求参数过大&#xff0c;最好控制再10000以内。 {"index":{"_id":"baec07466732902d22a24ba01ff09751"}} {"uuid":"baec07466732902d22a24ba01ff0975…

用Kimi做研究:准实验设计的智能解决方案

目录 1.研究策略设计 2.过程框架设计 3.背景变量 4.细节设计 准实验设计是一种介于实验与观察研究之间的研究方法&#xff0c;准实验设计是在无法完全控制实验条件的情况下进行因果关系的探索。与传统实验设计相比&#xff0c;准实验设计不具备随机分配实验对象到各处理组的…

零基础入门Erlang

1.Erlang介绍 Index - Erlang/OTP Erlang是一种通用的面向并发的编程语言 Erlang是一个结构化&#xff0c;动态类型编程语言&#xff0c;内建并行计算支持 使用Erlang来编写分布式应用要简单的多&#xff0c;因为它的分布式机制是透明的 1.1 为什么选择Erlang 需要处理大量…

JavaWeb开发(九)JSP技术

1. JavaWeb JSP技术 1.1. JSP简介 1.1.1. 什么是JSP JSP全名为Java Server Page 是为了简化servlet的工作而出现的替代品。在JSP中java代码与HTML共同存在&#xff0c;其中HTML代码用于展示静态的内容&#xff0c;java代码用来展示动态的内容。 1.1.2. 为什么出现JSP技术 19…

鸿蒙UI开发——Toast即时提示框的使用

1、概 述 Toast提示又称即时反馈&#xff0c;是一种临时性的消息提示框&#xff0c;用于向用户显示简短的操作反馈或状态信息。它通常在屏幕的底部或顶部短暂弹出&#xff0c;随后在一段时间后自动消失。即时反馈的主要目的是提供简洁、不打扰的信息反馈&#xff0c;避免干扰用…

基于Spring Boot的海滨体育馆管理系统的设计与实现

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的海滨体育馆管理系统的设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 宠物医院…