React原理之Fiber详解
前置文章:
- React原理之 React 整体架构解读
- React原理之整体渲染流程
-----读懂这一篇需要对 React 整体架构和渲染流程有大致的概念 😊-----
在React原理之 React 整体架构解读中,简单介绍了 Fiber 架构,也了解了 Fiber 节点的概念。
Fiber 节点是 Fiber 架构的核心概念之一,它是一种虚拟 DOM 的实现方式。
Fiber 本质上是一个对象, 使用了链表结构。
双重缓冲是一种渲染优化技术,其使用两个 Fiber 树来管理渲染,即当前树 current tree和工作树 work-in-progress tree。当前树代表屏幕上当前显示的内容,而工作树用于准备下一次的渲染更新,用以实现平滑的更新。
Fiber 的含义
前面反复提到,与 React16 之前的栈式架构相比,Fiber 架构中的更新工作是可以中断的循环过程。
fiber 译为“纤维”,React 的 Fiber 架构借鉴了 Fiber 作为轻量级、可调度执行单元的概念,将其应用于组件的渲染和更新过程中。
实际上,Fiber
包含三层含义:
- fiber 架构
- 静态的数据结构
- 动态的工作单元
fiber 架构
React16
之前的Reconciler
采用递归的方式执行,数据保存在递归调用栈中,所以被称为stack Reconciler
。React16
的Reconciler
基于Fiber节点
实现,被称为Fiber Reconciler
,各个 FiberNode 之间通过链表的形式串联起来。
看一下简化版源码:
function FiberNode(tag, pendingProps, key, mode) {//...// Fiber树结构:周围的 Fiber Node 通过链表的形式进行关联this.return = null; // 上一级节点this.child = null; // 第一个子节点this.sibling = null; // 下一个同级节点this.index = 0; // 在上一级节点中的索引//...
}
静态的数据结构
作为静态的数据结构来说,每个Fiber节点
对应一个React element
,保存了该组件的类型(函数组件/类组件/原生组件…)、对应的 DOM 节点等信息。
function FiberNode(tag, pendingProps, key, mode) {//...// 实例属性:// 节点类型标记 Function/Class/Host...this.tag = tag;// key属性this.key = key;// 组件的元素类型,大部分情况同type,某些情况不同,比如FunctionComponent使用React.memo包裹this.elementType = null;// 实际的 JavaScript 对象类型。对于 FunctionComponent,指函数本身,对于ClassComponent,指class,对于HostComponent,指DOM节点tagNamethis.type = null;// 节点对应的真实DOM节点this.stateNode = null;//...
}
动态的工作单元
作为动态的工作单元来说,每个Fiber节点
保存了本次更新中该组件改变的状态、要执行的工作(需要被删除/被插入页面中/被更新…)。
// Props和State 改变相关信息
this.pendingProps = pendingProps; // 当前待处理的props
this.memoizedProps = null; // 上次渲染完成,已应用到组件的props
this.updateQueue = null; // 更新队列,用于存储状态更新和回调
this.memoizedState = null; // 上次渲染完成后的state,即组件的当前状态
this.dependencies = null; // 依赖列表,用于追踪副作用this.mode = mode; // Fiber的模式// Effects 副作用
this.flags = NoFlags; // Fiber的标志位,表示Fiber的生命周期状态
this.subtreeFlags = NoFlags; // 子树的标志位
this.deletions = null; // 待删除的子Fiber列表// 优先级调度
this.lanes = NoLanes; // 当前Fiber的优先级
this.childLanes = NoLanes; // 子Fiber的优先级
下一篇:React原理之Fiber双缓冲
相关文章:
![](https://i-blog.csdnimg.cn/direct/43204a2ad2d0402a95c20d4ab2d455de.png)
React原理之Fiber详解
前置文章: React原理之 React 整体架构解读React原理之整体渲染流程 -----读懂这一篇需要对 React 整体架构和渲染流程有大致的概念 😊----- 在React原理之 React 整体架构解读中,简单介绍了 Fiber 架构,也了解了 Fiber 节点的…...
![](https://www.ngui.cc/images/no-images.jpg)
远离“优越感”陷阱,拥抱美好人生
在人生的漫长旅程中,我们不断地与他人相遇、相知、相交,在各种关系中寻找温暖、支持与成长。然而,并非所有的关系都如我们所愿,有些关系甚至可能成为我们前进道路上的阻碍。正如我们所知,唯利是图者不可交,但有一种关系比索要金钱更值得警惕,那就是找你索取满足感的关系…...
![](https://www.ngui.cc/images/no-images.jpg)
Redis的线程模型
Redis作为一种基于内存的高性能键值对数据库,其线程模型和IO模型是实现高性能的关键因素。以下将详细探讨Redis的线程与IO模型,内容不少于2000字。 一、Redis的线程模型 Redis的线程模型是理解其高性能的重要基础。在Redis的发展过程中,其线…...
![](https://i-blog.csdnimg.cn/direct/85eec2dad3f44f4a84c3b1016b7c1f3e.png)
ubuntu24.04安装nginx1.24
ubuntu安装nginx 更新包索引 sudo apt update安装nginx sudo apt install nginx确认安装成功并检查Nginx版本 nginx -v启动Nginx服务 sudo systemctl start nginx设置Nginx开机自启 sudo systemctl enable nginx在浏览器中访问 http://<your_server_IP> 来确认Nginx…...
![](https://i-blog.csdnimg.cn/direct/c6577608eca64b3d8b9ea22ff0b3c5b5.jpeg)
一款好看的WordPress REST API 主题
介绍: 主题特色: 使用Nuxtjs WordPress Rest Api 实现前后端分离,可完成多端部署; 主题支持自动切换黑夜模式。 使用说明: service 目录为wordpress主题文件,需要拷贝到wordpress主题目录下࿰…...
![](https://www.ngui.cc/images/no-images.jpg)
《5G 与区块链融合:智能城市服务质量的飞跃》
在科技飞速发展的时代,5G 技术的普及正以前所未有的速度改变着我们的生活,而区块链技术的兴起也为各领域带来了创新的解决方案。当这两种前沿技术相互结合,将为智能城市的发展注入强大动力,显著提升服务质量,开创更加便…...
![](https://img-blog.csdnimg.cn/img_convert/dc9f7168ce9a3476d8b025f38997c13e.png)
前后端分离开发:用 Apifox 高效管理 API
目录 1.前后台分离开发介绍 2.API 2.1 APIfox介绍 2.2 接口文档管理 1.前后台分离开发介绍 前端开发有2种方式:「前后台混合开发」和「前后台分离开发」。 前后台混合开发,顾名思义就是前台后台代码混在一起开发,如下图所示:…...
![](https://www.ngui.cc/images/no-images.jpg)
Go Channel 详解
概述 在 Go 语言中,channel 是一种用于在 goroutine 之间传递数据的机制。它提供了同步和通信的能力,使得并发编程变得更加简单和安全。Channel 在 Go 语言中的设计是类型安全的,并且支持发送和接收两种操作。 基本概念 创建通道 创建一个…...
![](https://i-blog.csdnimg.cn/direct/022283e36e6e4f5bab6c3447f2f22763.png)
使用FModel提取游戏资产
使用FModel提取游戏模型 前言FModel简介FModel安装FModel使用初次使用资产预览资产导出 附录dumperDumper-7生成usmap文件向游戏中注入dll 前言 这篇文章仅记录我作为初学者使用FModel工具提取某款游戏模型的过程。 FModel简介 FModel是一个开源软件,可以用于查看…...
![](https://www.ngui.cc/images/no-images.jpg)
Qt C++ 屏幕录制 保存mp4
在麒麟系统(基于 Linux)上优化 Qt C 的屏幕录制,主要针对捕获效率和编码速度。可以参考以下优化策略: 1. 使用更高效的屏幕捕获 API 麒麟系统作为 Linux 系统的一种,可以考虑直接使用 X11、Wayland、或 DRM/KMS API …...
![](https://i-blog.csdnimg.cn/direct/aeae8dfddb36457e8a1e8133d4a3ead9.png)
Adobe After Effects的插件--------CC Cylinder
CC Cylinder是柱体插件。它是AE内置的3D插件。 使用条件 该插件的作用是将2D图层转换为3D的柱体。所以使用该插件时要确保源图层为2D的。 我们以一张图片素材为例: 给图片图层添加CC Cylinder效果控件,然后新建一个摄像机(利用摄像机旋转、平移、推拉工具,方便在各个角度…...
![](https://www.ngui.cc/images/no-images.jpg)
Vue3项目开发——新闻发布管理系统(一)
文章目录 一、项目要实现的功能二、项目用到的技术栈三、项目创建1、pnpm安装2、创建项目3、项目启动四、项目配置1、ESLint2、Prettier3、ESLint + Prettier 进行配置代码风格3.1配置prettier3.2vue组件名称多单词组成 (忽略index.vue)3.3props解构(关闭)4、husky4.1husky…...
![](https://i-blog.csdnimg.cn/direct/06e43709728649b29373b88c8200b5fb.png)
前端调用后端,出现跨域报错怎么办
我前端是vue,后端是其他同事写的python,因为部署在不同的机器上,我前端如果直接调用他的python,axios请求就会出现跨域报错,如下 blocked by CORS policy 云云 怎么办呢,网上探索了一下午,才找…...
![](https://i-blog.csdnimg.cn/direct/62560508e14e49d385087494867761be.png)
使用Node-RED发送数据到巴法云
上一篇博文完成了Node-RED的安装,下面来尝试一下用Node-RED来发送数据到巴法云服务器。 我在教学用MQTT工具的思考-CSDN博客中说过,巴法云支持云云互联,可以连小米、百度,学生使用的兴趣高。所以今天先测试Node-RED和巴法云的连接…...
![](https://i-blog.csdnimg.cn/direct/6a0a6b6e9aa2473d9e036c42a1794fa7.png)
【今夕是何年】雅达利发布Atari 7800+游戏主机:配备无线手柄、HDMI接口
雅达利(Atari)发布了Atari 7800游戏主机,目前这款主机在其官方商城接受预定,售价129.99美元。Atari 7800游戏主机,作为Atari 7800系列的革新升级版本,搭载了高效的Rockchip 3128处理器,不仅确保…...
![](https://i-blog.csdnimg.cn/direct/451b0e18df094d73aa4b2bfcb59281dd.png)
APP支付宝授权获取code uniapp
1.点击使用plus.runtime跳转打开支付宝 //打开支付宝授权,在支付宝APP中授权后会在支付宝中跳转到你填写的h5地址//urls是授权地址可以后端拼接也可以前端写死 //以下是一个拼接示例,需修改app_id的值和redirect_uri的值即可 //app_id是商户的APPID&…...
![](https://www.ngui.cc/images/no-images.jpg)
在Linux系统下安装、配置ETCD
在Linux系统下安装、配置ETCD(一个分布式键值存储系统)涉及多个步骤,包括下载、安装、配置、启动以及使用ETCD的常用命令。以下是对这些步骤的详细讲解,内容不少于2000字。 一、ETCD简介 ETCD是一个高可用的键值存储系统&#x…...
![](https://www.ngui.cc/images/no-images.jpg)
lambda 表达式可以传递引用为什么需要引用捕获
当 lambda 表达式被传递或存储在其他地方时,通过引用捕获可以确保它始终访问正确的外部变量。—— 引用捕获可以精确地控制被捕获的引用变量的作用域。如果一个 lambda 表达式被存储在一个容器中,并且在不同的时间点被调用,引用捕获可以确保它…...
![](https://www.ngui.cc/images/no-images.jpg)
【Java】/* 双向链表 - 底层实现 */
【难点】:remove、removeAllKey 一、IList package bagfive;/*** Created with IntelliJ IDEA.* Description:* User: tangyuxiu* Date: 2024-08-21* Time: 20:30*/ public interface IList<E> {//头插法void addFirst(E data);//尾插法void addLast(E data…...
![](https://www.ngui.cc/images/no-images.jpg)
Go 语言协程管理精解
1.基础 协程切换需要操作寄存器,这些操作需要通过汇编辅助实现。另外,每一个协程都有一个协程栈,实际上协程栈也是有结构的。汇编程序和栈结构这些概念可能大部分开发者都不太了解,在介绍协程管理之间,先简要介绍。 1…...
![](https://i-blog.csdnimg.cn/direct/3d077edb53864018947b8e705c6d8556.png)
C库函数signal()信号处理
signal()是ANSI C信号处理函数,原型如下: #include <signal.h>typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); signal()将信号signum的处置设置为handler,该handler为SIG_IGNÿ…...
![](https://www.ngui.cc/images/no-images.jpg)
007 SpringCloudAlibaba基础使用(nacos,gateway)
文章目录 cubemall-commoncubemall-productcubemall-gateway https://nacos.io/ https://github.com/alibaba/nacos/releases/tag/1.4.1 https://github.com/alibaba/spring-cloud-alibaba https://github.com/alibaba/Nacos https://developer.aliyun.com/mvn/guide https…...
![](https://www.ngui.cc/images/no-images.jpg)
编译环境揭秘
不同平台因为偏好差异,编译环境的准备会有差异。对于MSVC,微软提供简单的VS安装界面,比较省心。在Ubuntu发行版,gcc/make等程序可能不自带,当需要安装这些软件时就需要不少命令。当然比较麻烦,提供了统一的…...
![](https://i-blog.csdnimg.cn/direct/bb186e96f6634e7893f038b290db009f.png)
不同的字符集(ASCII、UTF-8、UTF-16/UCS-2、UTF-32/UCS-4)
来自:C标准库(第2版)...
![](https://i-blog.csdnimg.cn/direct/fdab9d661f344c12ae6bf11054c53c68.png#pic_center)
STM32f407 网络接收 fpga 的 bin 文件并更新到 fpga series7(3)
STM32f407 网络接收 fpga 的 bin 文件并更新到 fpga series7(3) 简介 实验 3:在搭建好 tcp 服务器,并拟定好协议的前提下,接收每一个 bin 文件的块,配置到 fpga。 原理图 fpga fpga1 stm32 接线总结 // fpga引脚 stm32…...
![](https://www.ngui.cc/images/no-images.jpg)
JavaScript基础知识(七)
数组相关api再续前缘 arr.forEach(function) 对arr数组的每一项执行遍历操作,并且可以通过function来对相关元素进行二次操作 function: 函数,同时接收三个参数 - item: 数组中的每一项 - index: 数组每一项的下标(item的对应下标) - arr: 原数组 arr.map(function) 对数组的…...
![](https://i-blog.csdnimg.cn/direct/c15709aa20bc4f7280b5e3430999a651.png)
20240821让飞凌的OK3588-C的核心板在Linux R4下挂载1TB的exFAT格式的TF卡
fdisk -l df -h df -t df -T mount 20240821让飞凌的OK3588-C的核心板在Linux R4下挂载1TB的exFAT格式的TF卡 2024/8/21 19:47 百度:rk3588 buildroot exFAT mount: mounting /dev/mmcblk1p1 on /mnt failed: Invalid argument Disk /dev/mmcblk1: 955 GB, 10254234…...
![](https://www.ngui.cc/images/no-images.jpg)
Java HashMap练习
JDK1.2添加,线程不安全,性能相对较好 注意:允许使用null作为key或者value 使用数组加链表结构,结合数组和链表的优点 Hash Map的基本使用 package HashMap;import text5.Student;import java.util.Collection; import java.ut…...
![](https://i-blog.csdnimg.cn/direct/c3af8c4534ea4da49a5bfd4e04326846.png)
前后端分离项目实战-通用管理系统搭建(前端Vue3+ElementPlus,后端Springboot+Mysql+Redis)第三篇:登录功能优化
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...
![](https://www.ngui.cc/images/no-images.jpg)
8.20 Redis ACL配置 多个用户连接同一个Redis
**一、首先通过 linux命令 redis-cli 输入用户名和密码连接redis的客户端** **二、查看用户,创建用户,设置密码操作** (1)**ACL LIST** 命令 可以查看到当前的权限用户 (2)**ACL SETUSER userName** 此…...
![](/images/no-images.jpg)
网页制作模板的网站代码/如何推广平台
函数模板定义的一般格式为 template <typename 参数化类型名1,....typename 参数化类型名n>函数返回类型 函数名(形式参数列表){函数体}说明: template 和 typename为关键字,<>尖括号内声明所使用的“参数化类型名”。 参数化类型名可以使用任何标识符&…...
![](http://blog.51cto.com/attachment/201008/232745391.jpg)
昆明做网站建设公司/网络广告发布
资源准备 说明:本文以Mac系统为例,所以准备的软件都需要是适合Mac版本的. Android SDK:android-sdk-mac_86 Android NDK: android-ndk-r4b-darwin-x86 Eclipse ADT CDT ANT搭建Android SDK开发环境 Android SDK还发环境搭建步骤: 1:Jdk安装,要求1.5以上.一般的Mac OS中已经预装…...
![](/images/no-images.jpg)
wordpress插件连不上/网站策划运营
培训主题 消费系统培训 消费机功能基本操作介绍 CM20集消费机 出纳机 补贴机功能于一体 机器的操作 分为机器操作和软件操作两大块 其中可以通过机器操作来实现消费机 出纳机 补贴机之间的切换 软件界面简洁清晰 操作方便 功能齐全 系统稳定可靠 大大提升了管理效率 机器硬件核…...
![](/images/no-images.jpg)
建设网站需要什么软件下载/培训心得体会范文
连表操作一对一 在app的models.py文件内添加以下内容用户创建一对多关系的表: 123456789101112from django.db import models # Create your models here.class UserType(models.Model): nid models.AutoField(primary_keyTrue) caption models.CharField(max_len…...
![](https://img-blog.csdnimg.cn/75a2540a4794458bb4e6c8e9ecbe2dd3.png#pic_center)
做网站好看的旅行背景图片/如何做网络销售平台
导语 根据千瓜数据显示,电影上线以来,铃芽之旅这个IP也在小红书平台发生了惊人的增长。累计话题浏览量超1.23亿,笔记预估阅读总数近五千万。攀升的数字背后,是属于年轻一代的狂欢! 果集千瓜数据 铃芽之旅在小红书平台…...
![](https://img-blog.csdnimg.cn/img_convert/346c64f89d2436e11e51252044d7eaf0.png)
做博客和做网站/外贸网站推广seo
------------ 本文来自 Linux用户及权限命令 - 阿P博客,技术博客,个人博客, 博客www.wxqsearch.cn一、用户相关信息存储位置账户信息存储:/etc/passwd密码信息存储:/etc/shadow组信息:/etc/group二、用户管理useradd:创建创建to…...