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双缓冲
相关文章:
React原理之Fiber详解
前置文章: React原理之 React 整体架构解读React原理之整体渲染流程 -----读懂这一篇需要对 React 整体架构和渲染流程有大致的概念 😊----- 在React原理之 React 整体架构解读中,简单介绍了 Fiber 架构,也了解了 Fiber 节点的…...
远离“优越感”陷阱,拥抱美好人生
在人生的漫长旅程中,我们不断地与他人相遇、相知、相交,在各种关系中寻找温暖、支持与成长。然而,并非所有的关系都如我们所愿,有些关系甚至可能成为我们前进道路上的阻碍。正如我们所知,唯利是图者不可交,但有一种关系比索要金钱更值得警惕,那就是找你索取满足感的关系…...
Redis的线程模型
Redis作为一种基于内存的高性能键值对数据库,其线程模型和IO模型是实现高性能的关键因素。以下将详细探讨Redis的线程与IO模型,内容不少于2000字。 一、Redis的线程模型 Redis的线程模型是理解其高性能的重要基础。在Redis的发展过程中,其线…...
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…...
一款好看的WordPress REST API 主题
介绍: 主题特色: 使用Nuxtjs WordPress Rest Api 实现前后端分离,可完成多端部署; 主题支持自动切换黑夜模式。 使用说明: service 目录为wordpress主题文件,需要拷贝到wordpress主题目录下࿰…...
《5G 与区块链融合:智能城市服务质量的飞跃》
在科技飞速发展的时代,5G 技术的普及正以前所未有的速度改变着我们的生活,而区块链技术的兴起也为各领域带来了创新的解决方案。当这两种前沿技术相互结合,将为智能城市的发展注入强大动力,显著提升服务质量,开创更加便…...
前后端分离开发:用 Apifox 高效管理 API
目录 1.前后台分离开发介绍 2.API 2.1 APIfox介绍 2.2 接口文档管理 1.前后台分离开发介绍 前端开发有2种方式:「前后台混合开发」和「前后台分离开发」。 前后台混合开发,顾名思义就是前台后台代码混在一起开发,如下图所示:…...
Go Channel 详解
概述 在 Go 语言中,channel 是一种用于在 goroutine 之间传递数据的机制。它提供了同步和通信的能力,使得并发编程变得更加简单和安全。Channel 在 Go 语言中的设计是类型安全的,并且支持发送和接收两种操作。 基本概念 创建通道 创建一个…...
使用FModel提取游戏资产
使用FModel提取游戏模型 前言FModel简介FModel安装FModel使用初次使用资产预览资产导出 附录dumperDumper-7生成usmap文件向游戏中注入dll 前言 这篇文章仅记录我作为初学者使用FModel工具提取某款游戏模型的过程。 FModel简介 FModel是一个开源软件,可以用于查看…...
Qt C++ 屏幕录制 保存mp4
在麒麟系统(基于 Linux)上优化 Qt C 的屏幕录制,主要针对捕获效率和编码速度。可以参考以下优化策略: 1. 使用更高效的屏幕捕获 API 麒麟系统作为 Linux 系统的一种,可以考虑直接使用 X11、Wayland、或 DRM/KMS API …...
Adobe After Effects的插件--------CC Cylinder
CC Cylinder是柱体插件。它是AE内置的3D插件。 使用条件 该插件的作用是将2D图层转换为3D的柱体。所以使用该插件时要确保源图层为2D的。 我们以一张图片素材为例: 给图片图层添加CC Cylinder效果控件,然后新建一个摄像机(利用摄像机旋转、平移、推拉工具,方便在各个角度…...
Vue3项目开发——新闻发布管理系统(一)
文章目录 一、项目要实现的功能二、项目用到的技术栈三、项目创建1、pnpm安装2、创建项目3、项目启动四、项目配置1、ESLint2、Prettier3、ESLint + Prettier 进行配置代码风格3.1配置prettier3.2vue组件名称多单词组成 (忽略index.vue)3.3props解构(关闭)4、husky4.1husky…...
前端调用后端,出现跨域报错怎么办
我前端是vue,后端是其他同事写的python,因为部署在不同的机器上,我前端如果直接调用他的python,axios请求就会出现跨域报错,如下 blocked by CORS policy 云云 怎么办呢,网上探索了一下午,才找…...
使用Node-RED发送数据到巴法云
上一篇博文完成了Node-RED的安装,下面来尝试一下用Node-RED来发送数据到巴法云服务器。 我在教学用MQTT工具的思考-CSDN博客中说过,巴法云支持云云互联,可以连小米、百度,学生使用的兴趣高。所以今天先测试Node-RED和巴法云的连接…...
【今夕是何年】雅达利发布Atari 7800+游戏主机:配备无线手柄、HDMI接口
雅达利(Atari)发布了Atari 7800游戏主机,目前这款主机在其官方商城接受预定,售价129.99美元。Atari 7800游戏主机,作为Atari 7800系列的革新升级版本,搭载了高效的Rockchip 3128处理器,不仅确保…...
APP支付宝授权获取code uniapp
1.点击使用plus.runtime跳转打开支付宝 //打开支付宝授权,在支付宝APP中授权后会在支付宝中跳转到你填写的h5地址//urls是授权地址可以后端拼接也可以前端写死 //以下是一个拼接示例,需修改app_id的值和redirect_uri的值即可 //app_id是商户的APPID&…...
在Linux系统下安装、配置ETCD
在Linux系统下安装、配置ETCD(一个分布式键值存储系统)涉及多个步骤,包括下载、安装、配置、启动以及使用ETCD的常用命令。以下是对这些步骤的详细讲解,内容不少于2000字。 一、ETCD简介 ETCD是一个高可用的键值存储系统&#x…...
lambda 表达式可以传递引用为什么需要引用捕获
当 lambda 表达式被传递或存储在其他地方时,通过引用捕获可以确保它始终访问正确的外部变量。—— 引用捕获可以精确地控制被捕获的引用变量的作用域。如果一个 lambda 表达式被存储在一个容器中,并且在不同的时间点被调用,引用捕获可以确保它…...
【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…...
Go 语言协程管理精解
1.基础 协程切换需要操作寄存器,这些操作需要通过汇编辅助实现。另外,每一个协程都有一个协程栈,实际上协程栈也是有结构的。汇编程序和栈结构这些概念可能大部分开发者都不太了解,在介绍协程管理之间,先简要介绍。 1…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
