说说 fiber、DOM、ReactElement、实例对象之间的引用关系

news2024/12/29 22:53:54

大家好,我是前端西瓜哥。

本文探究 fiber、DOM、ReactElement、类组件实例之间的引用关系说明。

React 版本为 18.2.0

原生组件 fiber

原生组件 fiber,指的就是 type 为 “span”、“div” 的 fiber。

  1. fiber.stateNode 指向真实 DOM 节点;
  2. node["__reactFiber$" + randomKey] 指向对应 fiber,使用随机数是防止和业务代码的属性名冲突,起着类似 symbol 的效果;
  3. node["__reactProps$" + randomKey] 指向最新 props 对象;

类组件 fiber

  1. fiber.stateNode 指向类实例对象 instance;
  2. instance.__reactInternalSnapshotBeforeUpdate 指向 snapshot 对象(该对象通过 getSnapshotBeforeUpdate 生成,并提供给 componentDidUpdate 使用);

利用 DOM 节点的 ['__reactFiber$' + randomKey] 属性,我们能拿到对应的原生组件 fiber。

通过这个 fiber,我们其实拿到了整棵 fiber 树。比如我们可以通过递归访问 fiber.return 找到它所在的类组件或函数组件 fiber。

在控制台选中一个元素,然后输入 $0.__reactFi 然后按下 tab 键补全属性,然后回车,我们就拿到了一个原生组件 fiber。

通过这个小技巧,我们可以去观摩观摩使用了 React 的网站的 fiber 树结构,比如 figma。

React 版本太低的话,是没有这个属性的。

根 fiber

rootFiber 是一棵 fiber 树的根节点。

fiberRoot 是 fiber 树的根节点的维护者,它的 current 决定使用两棵 fiber 树的那一棵(使用了双缓存技术)。

  1. fiberRoot.current 指向一个 rootFiber 节点;
  2. rootFiber.stateNode 指向 fiberRoot;
  3. rootNode["__reactContainer$" + randomKey] 指向 rootFiber

ReactElement

ReactElement 的 _owner 指向向上最近的类组件或函数组件 fiber。

结尾

我是前端西瓜哥,欢迎关注我,学习更多前端知识。

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

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

相关文章

Tableau可视化设计案例-03基本表、树形图、气泡图、词云

文章目录Tableau可视化设计案例03基本表、树形图、气泡图、词云1.基本表1.1基本表的使用1.2凸显表的使用1.3二值凸显表2.树形图2.1不同类型酒店数量与评价人数2.2油尖旺不同类型酒店数量与价格3.气泡图与词云3.1不同地区酒店数量与平均价格气泡图3.2动作电影动态气泡图3.3词云图…

Dubbo 4 Dubbo 高级特性 4.2 Dubbo 常用高级配置 4.2.1 序列化

Dubbo 【黑马程序员Dubbo快速入门,Java分布式框架dubbo教程】 4 Dubbo 高级特性 文章目录Dubbo4 Dubbo 高级特性4.2 Dubbo 常用高级配置4.2.1 序列化4.2 Dubbo 常用高级配置 4.2.1 序列化 【一个问题】 两个机器传输数据,如何传输Java对象&#xff…

【YOLOv7-环境搭建⑥】PyTorch安装

下载链接: 来源:(博主)唐三. 链接:https://pan.baidu.com/s/1y6s_EScOqvraFcx7iPSy1g 提取码:m1oa 安装步骤: 在命令指示符中输入以下命令: activate→conda activate py37→输入以下命令&#xff08…

【Python机器学习】密度聚类DBSCAN、OPTICS的讲解及实战演示(附源码 超详细)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 划分聚类、密度聚类和模型聚类是比较有代表性的三种聚类思路 1:划分聚类 划分(Partitioning)聚类是基于距离的,它的基本思想是使簇内的点距离尽量近、簇间的点距离尽量远。k…

UOS SDN

​ 文章目录 一.安装相关软件包二.上传并解压opendaylight软件包三.创建拓扑四.下发流表五.启动HTTP-server服务六.截图测试启动 OpenDayLight 的 karaf 程序,并安装如下组件: feature:install odl-restconf feature:install odl-l2switch-switch-ui feature:install odl-…

关于torch.fx的使用

torch.fx 前言 最近在学习一些AI编译器,推理框架的知识,恰好看到了torch.fx这个部分。这个其实在1.10就已经出来了,但是一直不知道,所以花了一点时间学习了这部分的内容。 以下所有的代码基于Mac M1 pytorch 1.13,其…

JavaScript(六):数组

JavaScript数组数组的创建方式数组的索引(不使用内置方法)数组的遍历数组中新增元素(不使用内置方法)数组的检测数组的方法数组的创建方式 1.利用new创建数组 var 数组名 new Array(); 例如: var arr new Array();…

一句话生成角色动画 # text2motion

‍‍‍‍当你和他人谈论人工智能的潜力时,很多人都表露出同样的担心:害怕被取代‍特别在最近几个月,随着生成式人工智能的投资和创新的爆炸性增长,这些不安的感觉更加强烈。机器学习中相对较新的创新,即扩散模型&#…

干货 | 轮廓逼近原理与OpenCV应用(附Python-OpenCV文档下载)

导 读 本文主要介绍轮廓逼近的原理及其在OpenCV中的使用演示。同时可在文末获取Python-OpenCV学习文档pdf。 背景介绍 轮廓逼近的应用比较广泛,如下路线俯视图的简化: 通过迭代平滑一些顶点,从而产出更加线性的路线: 当然这只是轮廓逼近的其中一个应用,后续我们将…

nodejs企业工厂设备维修管理系统vue

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 web简介 4 2.3 B/S结构 4 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:技术背景 5 …

【Linux权限】文件权限值,权限掩码,粘滞位,普通用户添加信任名单

目录 1.权限分为2种用户:超级用户,普通用户 2.文件类型和访问权限 ​3.权限掩码(八进制) 4.sudo短暂提升权限 5.粘滞位 1.权限分为2种用户:超级用户,普通用户 超级用户(通常为root&#x…

【前端开发学习】5.JQuery

文章目录1 JQuery2 快速上手3 寻找标签3.1 直接寻找3.2 间接寻找案例:菜单转换4 操作样式5 值的操作案例:动态创建数据库6 事件案例:表格操作7 前端整合案例1 JQuery 一个 JavaScript 的第三方模块(第三方类库)。 基…

再学C语言7:数据类型(3)——char类型

char类型用于存储字母和标点符号之类的字符 在技术实现上,char是整数类型,因为char类型实际存储的是整数而不是字符 为了处理字符,计算机使用一种数字编码,用特定的整数表示特定的字符 经典和常用的是ASCII码,标准A…

React学习29(react-redux最终完整版)

说明 1)所有变量名字要规范,尽量触发对象的简写形式 2)reducers文件夹中,编写index.js专门用于汇总并暴露所有的reducer 项目结构 代码示例 index.js import React from react import ReactDOM from react-dom import App fr…

ios 证书与签名

证书与签名 XCode中配置的Code Signing Identity(entitlements、certificate)必须与Provisioning Profile匹配,并且配置的Certificate必须在本机Keychain Access中存在对应Public/Private Key Pair,否则编译会报错。 X…

Improved Techniques for Training Score-Based Generative Models论文阅读

论文链接:Improved Techniques for Training Score-Based Generative Models 文章目录摘要引言背景郎之万动力学基于分数的生成模型选择噪声尺度初始的噪声尺度其它噪声等级结合噪音信息配置退火朗之万动力学EMA改善稳定性组合所有技巧定量结果消融研究更高分辨率结…

[附源码]计算机毕业设计PythonQ宝商城(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

同样是1亿数据,为什么nutsdb扛不住,而badgerdb可以?

背景 ​ 之前在知乎上看到一个问题:作为一个KV数据库,levelDB为什么使用LSM树实现,而不是hash索引?当时就想作答一番。不过看到问题下方已经有大佬作答了,而我也说不出什么新东西来。于是选择作罢。 ​ 但是最近有nut…

磁共振功能成像BOLD-fMRI原理

小川诚二(Seiji Ogawa)教授于1990年首次在大鼠上实现了功能磁共振成像 fMRI的对比度产生机制 fMRI的信号来源仍然为氢质子,MRI解剖图像对解剖结构的差别非常敏感,fMRI功能图像对神经元活动所伴随的生理变化敏感fMRI的生理学基础 脑的血液动力学&#x…

【Ubuntu】将Qt程序打包制作成deb

1、打包Qt程序 1.1 下载linuxdeployqt 如果使用环境是x86可以直接下载,下载地址 https://github.com/probonopd/linuxdeployqt/releases如果使用环境是嵌入式,需要下载linuxdeployqt源码,自行编译 1.2 安装linuxdeployqt 将下载解压后的linuxdeployqt,拷贝到/usr/local…