FiberNode结构解析

FiberNode结构解析

FiberNode(也称为 Fiber 节点)是 React Fiber 架构中的核心概念之一,用于表示组件的层级结构和渲染过程中的任务。

function FiberNode(tag, pendingProps, key, mode) {// Instancethis.tag = tag;this.key = key;this.elementType = null;this.type = null;this.stateNode = null; // Fiberthis.return = null;this.child = null;this.sibling = null;this.index = 0;this.ref = null;this.pendingProps = pendingProps;this.memoizedProps = null;this.updateQueue = null;this.memoizedState = null;this.dependencies = null;this.mode = mode; // Effectsthis.flags = NoFlags;this.subtreeFlags = NoFlags;this.deletions = null;this.lanes = NoLanes;this.childLanes = NoLanes;this.alternate = null;{// Note: The following is done to avoid a v8 performance cliff.//// Initializing the fields below to smis and later updating them with// double values will cause Fibers to end up having separate shapes.// This behavior/bug has something to do with Object.preventExtension().// Fortunately this only impacts DEV builds.// Unfortunately it makes React unusably slow for some applications.// To work around this, initialize the fields below with doubles.//// Learn more about this here:// https://github.com/facebook/react/issues/14365// https://bugs.chromium.org/p/v8/issues/detail?id=8538this.actualDuration = Number.NaN;this.actualStartTime = Number.NaN;this.selfBaseDuration = Number.NaN;this.treeBaseDuration = Number.NaN; // It's okay to replace the initial doubles with smis after initialization.// This won't trigger the performance cliff mentioned above,// and it simplifies other profiler code (including DevTools).this.actualDuration = 0;this.actualStartTime = -1;this.selfBaseDuration = 0;this.treeBaseDuration = 0;}{// This isn't directly used but is handy for debugging internals:this._debugSource = null;this._debugOwner = null;this._debugNeedsRemount = false;this._debugHookTypes = null;if (!hasBadMapPolyfill && typeof Object.preventExtensions === 'function') {Object.preventExtensions(this);}}
}

tag

表示 FiberNode 的类型,可以是 HostComponent、ClassComponent、FunctionComponent 等。

key

表示组件的唯一标识符,用于在列表渲染中进行元素的重用。

elementType

表示组件元素的类型。大部分情况同type,某些情况不同,比如FunctionComponent使用React.memo包裹。

type

type 属性表示 FiberNode 对应的组件类型,可以是字符串(原生组件)或函数/类(自定义组件)。对于 FunctionComponent,指函数本身,对于ClassComponent,指class,对于HostComponent,指DOM节点tagName。

stateNode

每个 FiberNode 包含一个 stateNode 属性,它指向组件实例。stateNode 可以是一个 DOM 元素(对于原生组件),也可以是一个类实例(对于自定义组件)。

​ FiberNode 使用链表结构来表示组件的层级关系

return

return 指向父节点。

child

child 属性指向第一个子节点。

sibling

sibling 属性指向下一个兄弟节点。

例子:
function App() {return (<div>i am<span>SongShao</span></div>)
}

对应的Fiber树结构

		    App||child || return||--------div ----------------||  			 ||child || return  child || return ||				 ||i am ----------- spansibling    ||child || return||SongShao

这里需要提一下,为什么父级指针叫做return而不是parent或者father呢?因为作为一个工作单元,return指节点执完completeWork(本章后面会介绍)后会返回的下一个节点。子Fiber节点及其兄弟节点完成工作后会返回其父级节点,所以用return指代父级节点。

index

在父节点中的索引位置。

ref

用于引用组件。

pendingProps

组件的待处理属性。

memoizedProps 和 memoizedState

这些属性保存了组件的当前状态(props 和 state)。在渲染过程中,React 使用 memoizedProps 和 memoizedState 保存组件的最新状态,并通过比较前后两次状态的差异,确定是否需要更新组件。

updateQueue

用于存储组件的更新队列。

dependencies

表示组件的依赖项。

mode

表示渲染模式。

flags 和 subtreeFlags

表示 FiberNode 的状态标志。

deletions

表示待删除的节点。

lanes 和 childLanes

表示调度的优先级。

alternate

alternate 属性指向 FiberNode 的替代节点。在渲染过程中,React 会创建两个 FiberNode,一个表示当前渲染状态,另一个表示下一次渲染状态。通过 alternate 属性,React 在两个状态之间进行比较,找出需要更新的节点。

actualDuration、actualStartTime、selfBaseDuration、treeBaseDuration

用于记录组件的实际渲染时间和基准时间。

__debugSource、__debugOwner、__debugNeedsRemount、__debugHookTypes

用于调试和内部记录。

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

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

相关文章

数据库: 存储过程

sql server begin end用法: SQL Server中的BEGIN END用法是用于定义一个代码块&#xff0c;这个代码块可以包含多个SQL语句&#xff0c;BEGIN END通常用于控制流程语句&#xff0c;例如IF语句、WHILE语句、TRY CATCH语句等。在BEGIN END代码块中&#xff0c;可以使用变量、函数…

Python爬虫:Selenium的介绍及简单示例

Selenium是一个用于自动化Web应用程序测试的开源工具。它允许开发人员模拟用户在浏览器中的交互行为&#xff0c;以便自动执行各种测试任务&#xff0c;包括功能测试、性能测试和回归测试等。Selenium最初是为Web应用程序测试而创建的&#xff0c;但它也可用于Web数据抓取和其他…

C#学习 - 初识类型、变量、方法

构成C#语言的基本元素 关键字、操作符、标识符、文本都是标记&#xff08;Token&#xff09;&#xff0c;编译器能够识别 关键字&#xff08;Keyword&#xff09; C#有一般关键字&#xff08;C# Keyword&#xff1a;任何时候都是关键字&#xff09;和上下文关键字&#xff0…

Swift报错:“‘nil‘ is incompatible with return type ‘User‘”

func getUserById(userId: Int) -> User {if (userId ! nil) {...}return nil } 上述代码报了一个错误&#xff1a;“nil is incompatible with return type User”&#xff0c;表示“nil”与返回类型“User”不兼容。 解决方案&#xff1a; 将返回值类型改为Optional类型…

Jmeter进阶使用指南-分布式测试

当你需要模拟大量并发用户并测试应用程序的性能时&#xff0c;JMeter的分布式测试功能非常有用。分布式测试允许你使用多个JMeter实例来模拟并发用户&#xff0c;从而提供更高的负载。 下面是一个详细的介绍和讲解分布式测试的步骤&#xff1a; 准备主机和从机&#xff1a; 首…

计算机竞赛 基于深度学习的植物识别算法 - cnn opencv python

文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 MobileNetV2网络4 损失函数softmax 交叉熵4.1 softmax函数4.2 交叉熵损失函数 5 优化器SGD6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的植物识别算法 ** …

Vue3---uni-app--高德地图引用BUG

先给报错信息&#xff1a;module libs/map//libs/map_min.js is not defined, require args is /libs/map_min.js 查看我引用方法&#xff1a; 本人查阅资料发现 是 require 使用的是 commonJS方式引用说这个适配Vue2可我项目是Vue3应该使用ES6语法糖 然后我有跑了项目发现BU…

蓝桥杯官网练习题(凑算式)

类似填空题&#xff1a; ①算式900&#xff1a; https://blog.csdn.net/s44Sc21/article/details/132746513?spm1001.2014.3001.5501https://blog.csdn.net/s44Sc21/article/details/132746513?spm1001.2014.3001.5501 ②九宫幻方③七星填数④幻方填空&#xff1a;https:/…

Competitive Collaboration 论文阅读

论文信息 题目&#xff1a;Competitive Collaboration: Joint Unsupervised Learning of Depth, Camera Motion, Optical Flow and Motion Segmentation 作者&#xff1a;Anurag Ranjan&#xff0c; Varun Jampani&#xff0c; Lukas Balles 来源&#xff1a;CVPR 时间&#x…

JVM学习(三)--生产环境的线程问题诊断

1.如何定位哪个进程对cpu占用过高 使用top命令 2.如何定位到某个进程的具体某个线程 使用ps H -eo pid,tid,%cpu | grep 进程id (可以具体定位到某个进程的某个线程的cpu占用情况) 3.如何查看有问题线程的具体信息&#xff0c;定位到代码的行数 使用jstack 进程id |grep…

【 OpenGauss源码学习 —— 列存储(analyze)(四)】

列存储&#xff08;analyze&#xff09; AcquireSampleCStoreRows 函数es_get_attnums_to_analyze 函数CStoreRelGetCUNumByNow 函数CStore::GetLivedRowNumbers 函数InitGetValFunc 函数CStoreGetfstColIdx 函数CStore::GetCUDesc 函数CStore::IsTheWholeCuDeleted 函数CStore…

PHP调用java class 类实现文件签名

PHP调用java class 类实现文件签名 原始代码改造开始PHP内调用方式起因:对接某平台API接口,发送的文件需要做 SM3 签名,对方平台是java写的,只有java加密示例,照着java的加密算法翻译为PHP版本,在编码转换上始终有些差异。没办法,只能想办法使用他们的java方式。 原始代…

vue开发-语法和基础流程规范

当一个请求发生的时候 后端的扭转流程对标前端的扭转过程 ***vue 中 整体url触发整体流程服务流程&#xff1a; node 中定义了默认加载 vue.config.js 文件 &#xff08;vue.config.js 文件名不可更改&#xff09;-> vue.config.js 中 devServer 绑定了个 ip端口 和资源 -》…

Java版本企业工程行业管理系统源码

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示1…

初学Python记

Python这个编程语言的大名当然听说过了呀&#xff0c;这几年特别火&#xff0c;火的一塌涂地。大家可以回忆一下&#xff1a;朋友圈推荐的广告里经常可以看见python的网课广告。 本学期&#xff0c;学校开设了python课程&#xff0c;这几天学习了一下入了一下门&#xff0c;感…

OpenHarmony:如何使用HDF驱动控制LED灯

一、程序简介 该程序是基于OpenHarmony标准系统编写的基础外设类&#xff1a;RGB LED。 目前已在凌蒙派-RK3568开发板跑通。详细资料请参考官网&#xff1a;https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk3568-openharmony/tree/master/samples/b02_hdf_rgb_led。 …

C++ 判断

C 判断 判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&#xff09;。 下面是大多数编程语言中典型的判断结构的一般形式&#xff1a; 判断语句 C 编…

SpringMVC之前端增删改查实现

SpringMVC是一个基于MVC架构的框架&#xff0c;它可以帮助我们实现前后端的分离&#xff0c;同时也能很好地支持前端的增删改查操作。 配置 Cloudjun <?xml version"1.0" encoding"UTF-8" ?><taglib xmlns"http://java.sun.com/xml/ns/j…

TSINGSEE青犀/视频分析/边缘计算/AI算法·人员/区域入侵功能——多场景高效运用

TSINGSEE青犀视频人员/区域入侵功能可对重要区域进行实时监测&#xff0c;对监控区域进行7*24全天候管控&#xff0c;当监测到有人员靠近、闯入时&#xff0c;AI算法后台就会立即发出告警及时通知管理人员&#xff0c;变被动“监督”为主动“监控”&#xff0c;真正做到事前预警…

2023计算机毕业设计题目 毕设选题大全

文章目录 0 前言1 java web 管理系统 毕设选题2 java web 平台/业务系统 毕设选题3 游戏设计、动画设计类 毕设选题 (适合数媒的同学)4 算法开发5 数据挖掘 毕设选题6 大数据处理、云计算、区块链 毕设选题7 网络安全 毕设选题8 通信类/网络工程 毕设选题9 嵌入式 毕设选题10 开…