React源码之Fiber架构

news2025/4/3 0:57:54

对于Fiber我们可以理解为存储在内存中的Dom
对于React15在render阶段的reconcile是不可打断的,如果在操作大量的dom时,会存在卡顿,因为浏览器将所有的时间都交给了js引擎线程去执行,此时GUI渲染线程被阻塞,导致页面出现卡顿,无法响应用户对应的事件。
所以在React16之后就有了Scheduler来进行时间片的调度,给每一个task一定的时间,如果在这个时间内没有执行完,也要交出执行权给浏览器进行绘制和重排,所以异步可中断的更新需要一定的数据结构在内存中保存dom信息,所以产出了这样一种数据结构Fiber,也可以称为虚拟Dom。

Fiber数据结构

function FiberNode(
  tag: WorkTag,
  pendingProps: mixed,
  key: null | string,
  mode: TypeOfMode,
  ) {
    //保存节点的信息
    this.tag = tag;//对应组件的类型
    this.key = key;//key属性
    this.elementType = null;//元素类型
    this.type = null;//func或者class
    this.stateNode = null;//真实dom节点
    //连接成fiber树
    this.return = null;//指向父节点
    this.child = null;//指向child
    this.sibling = null;//指向兄弟节点
    this.index = 0;
    this.ref = null;
    //用来计算state
    this.pendingProps = pendingProps;
    this.memoizedProps = null;
    this.updateQueue = null;
    this.memoizedState = null;
    this.dependencies = null;
    this.mode = mode;
    
    //effect相关
    this.effectTag = NoEffect;
    this.nextEffect = null;
    this.firstEffect = null;
    this.lastEffect = null;
    //优先级相关的属性
    this.lanes = NoLanes;
    this.childLanes = NoLanes;
    //current和workInProgress的指针
    this.alternate = null;
}

Fiber双缓存

对于上述的讲解,我们知道了Fiber可以保存真实的dom,在mount的时候会先将jsx对象构建Fiber对象,形成Fiber树,这颗Fiber树叫做current Fiber并对应到真实Dom上。而正在构建的Fiber树叫做workInProgress Fiber,两棵树的节点会通过alternate相连。
对于这样的Dom结构会生成如下的Fiber
function App() {
return (


zi

bai



)
}
ReactDOM.render(, document.getElementById(“root”));
对于上述结构的Fiber图如下:
在这里插入图片描述

mount

在Mount时候只会创建FiberRoot和rootFiber两个节点,对于fiberRoot是指整个应用的根节点,只存在一个。对于rootFiber是指ReactDom.render或者ReactDOM.unstable_createRoot所创建出来的节点,可以存在多个。初始时如下:
在这里插入图片描述
然后根据jsx创建workInProgress Fiber,然后通过alternate链接
在这里插入图片描述
接着workInProgress Fiber会和current Fiber交换位置,此时workInProgress变为current Fiber并渲染成对应的真实Dom则为如下图:
在这里插入图片描述

update

在update时会根据状态变更后的jsx对象和current Fiber做对比形成新的workInProgress Fiber,然后workInProgress Fiber切换成current Fiber应用到真实dom就达到了更新的目的,而这一切都是在内存中发生的,从而减少了对dom好性能的操作。
在这里插入图片描述
最后再把workInProgress Fiber切换为current Fiber
在这里插入图片描述
上述为update时,current Fiber与workInProgress Fiber的变化

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

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

相关文章

PyTorch搭建循环神经网络(RNN)进行文本分类、预测及损失分析(对不同国家的语言单词和姓氏进行分类,附源码和数据集)

需要源码和数据集请点赞关注收藏后评论区留言~~~ 下面我们将使用循环神经网络训练来自18种起源于不同语言的数千种姓氏,并根据拼写方式预测名称的来源。 一、数据准备和预处理 总共有18个txt文件,并且对它们进行预处理,输出如下 部分预处理…

Windows版Ros环境的搭建以及Rviz显示激光点云信息

安装步骤: 1.安装visual studio 2019-2022 2.安装ROS 3.创建ROS快捷终端 4.运行测试效果 一、安装Visual Studio 2022 需要利用vs编译ROS代码,所以需要安装Visual Studio 2022 这里注意要使用vs2022,ROS wiki给的教程是使用2019 1).使…

Python学习小组课程-课程大纲与Python开发环境安装

一、前言 注意:此为内部小组学习资料,非售卖品,仅供学习参考。 为提升项目落地的逻辑思维能力,以及通过自我创造工具来提升工作效率,特成立Python学习小组。计划每周花一个小时进行在线会议直播学习,面向…

力扣21 - 合并两个有序链表【归并排序思维】

链式铠甲——合体一、题目描述二、思路分析三、代码详解way1【不带头结点】way2【带头结点】四、整体代码展示【需要自取】方法一:不带哨兵位【无头结点】方法二:带哨兵位【有头结点】五、总结与提炼一、题目描述 原题传送门🚪 将两个升序链…

vs2019编译ffmpeg4.4为静态库或动态库

参考文章:vs2019编译ffmpeg源码为静态库动态库【完整步骤、亲测可行】 文章目录编译测试编译 直接把博主的项目下下来 我打开里面FFmpeg文件发现它貌似是4.4版本 然后照着他给的步骤执行命令 先找到vs2019的命令行工具 然后执行两个脚本 执行以上两个脚本后&…

快速排序和归并排序非递归的详解

在经过主页中《八大排序》(下)的学习,我们了解了快速排序和归并排序且都是递归的思想,但是如果递归的深度很深呢?这一节我们就引出用非递归的思想解决这个问题。😵😵😵 快速排序非递…

根据给定数组,创建形状相同的数组并且采用不同方式填充full_like()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 根据给定数组,创建形状相同的数组 并且采用不同方式填充 full_like() [太阳]选择题 对下面代码中full_like函数结果描述错误的选项为? import numpy as np print(&q…

谷粒学院——Day05【后台系统前端项目创建、讲师管理模块前端开发】

后台系统前端项目创建 一、vue-element-admin 简介 vue-element-admin 是基于 element-ui 的一套后台管理系统集成方案。 功能:https://panjiachen.github.io/vue-element-admin-site/zh/guide/#功能 GitHub地址:https://github.com/PanJiaChen/vue-ele…

分布式锁_Redis分布式锁+Redisson分布式锁+Zookeeper分布式锁+Mysql分布式锁(原版)

分布式锁_Redis分布式锁Redisson分布式锁Zookeeper分布式锁Mysql分布式锁(原版) 文章目录分布式锁_Redis分布式锁Redisson分布式锁Zookeeper分布式锁Mysql分布式锁(原版)1. 传统锁回顾1.1. 从减库存聊起1.2. 环境准备1.3. 简单实现…

Dreamweaver网页设计与制作100例——HTML5期末考核大作业——票务网站整套网页

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置,有div的样式格局,这个实例比较全面,有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

正确查询DO基站IP

对于DO站的IP地址在系统中设置是否正确需要确定基站侧IP地址和RNC侧地址是否匹配,匹配关系为:基站侧IP地址减2即为RNC侧地址(如:RCS 234 BTS-IP: 6.33.84.30 则匹配RNC侧地址即为6.33.84.28),下面举例进行襄…

基于单片机的语音小车设计

目 录 引言 1 1 系统概述 1 1.1 声控产品前景和发展趋势 1 1.2 研究目的和意义 1 1.3 本次设计内容 2 2 系统设计的整体方案 2 2.1 主控芯片的方案论证 2 2.2 语音识别模块的方案论证 3 2.3 电机驱动方案选择 4 2.4 本章小节 4 3 系统…

使用ssh克隆GitHub仓库以及替换https方式

目录 使用ssh克隆GitHub仓库 第一步:生成ssh 第二步:添加SSH key 第三步:验证绑定是否成功 第四步:克隆 意外的情况: 情况1:ssh连接GitHub失败 情况2:使用git clone 不成功 替换原来的…

队列的简单实现

队列的简单实现一、什么是队列二、队列的分类三、队列的数据结构四、队列的基本操作1、初始化队列2、销毁队列3、入队4、出队5、队列判空6、获取队头元素7、获取队尾元素8、获取队列元素总结头文件基本操作一、什么是队列 首先我们既然想要实现队列就得明白什么是队列&#xff…

1.7.4、计算机网络体系结构中的术语

1.7.4、计算机网络体系结构中的术语 1.7.4.1、实体 实体: 任何可发送或接收信息的硬件或软件进程。 对等实体: 收发双方相同层次中的实体 1.7.4.2、协议 协议:控制两个的对等实体进行逻辑通信的规则的集合 之所以称为逻辑通信&#xf…

目标检测论文解读复现之五:改进YOLOv5的SAR图像舰船目标检测

目标检测论文解读复现 文章目录目标检测论文解读复现前言一、摘要二、网络模型及核心创新点三、应用数据集四、实验效果(部分展示)五、实验结论六、投稿期刊介绍前言 此前出了目标改进算法专栏,但是对于应用于什么场景,需要什么改…

HTML5期末考核大作业,电影网站——橙色国外电影 web期末作业设计网页

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置,有div的样式格局,这个实例比较全面,有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

【代码精读】ATF的异常向量表

快速链接: . 👉👉👉 【代码精读】–Kernel/ATF/optee等-目录👈👈👈 付费专栏-付费课程 【购买须知】:本专栏的视频介绍-----视频👈👈👈概要: 本文概述了ARMv8/ARMv9的aarch64体系中异常向量表的结构、以及基地寄存器的总结。然后通过导读ATF BL31的异常向量…

Flink系列文档-(YY09)-Flink时间语义

1 三种时间语义 在实时流式计算中,"时间"是一个能影响计算结果的非常重要因素! 试想场景:每隔1分钟计算一次最近10分钟的活跃用户量: ①假设此刻的时间是13:10,要计算的活跃用户量时间段为:[ …

【C++】类和对象(下)

​🌠 作者:阿亮joy. 🎆专栏:《吃透西嘎嘎》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉再谈构造…