详细理解React的Fiber结构

server/2024/9/25 21:28:42/

一、为什么会出现Fiber

       旧版 React 通过递归的方式进行渲染,使用的是 JS引擎自身的函数调用栈,它会一直执行到栈空为止。而Fiber实现了自己的组件调用栈,它以链表的形式遍历组件树,可以灵活的暂停、继续和丢弃执行的任务。实现方式是使用了浏览器requestIdleCallback这一 API
因为需要给用户制造一种应用加载很快的假象,所以不能让一个程序一直霸占着资源,需要通过调度策略来合理分配资源,提高浏览器的响应率。

二、什么是Fiber

        Fiber是一种数据结构,可以用一个纯js对象来表示

const fiber = {stateNode, //节点实例child, // 子节点sibling, // 兄弟节点return, // 父节点
}

1、任务优先级

   React 18引入了几种不同的任务优先级,包括:

  • synchronous:同步任务,通常用于处理用户交互事件(同步执行)
  • task:普通任务,用于处理如点击事件之外的更新 (在 nextTick之前执行)
  • animation:动画帧任务,通常用于动画和定时器(下一帧之前执行)
  • high:高优先级任务,用于快速更新UI(在不久的将来立即执行)
  • low:低优先级任务,可以延迟处理,如不紧急的数据获取(稍微延迟执行)

2、调度方式

    React渲染的过程可以被中断,将控制权交给浏览器,让位给高优先级。因为浏览器无法判断优先级,所以使用使用超时机制让给出控制权,被称为合作式调度

注意:
       任务优先级决定了哪些任务应该首先被调度器考虑执行,而协作式调度则允许正在执行的任务在必要时让出主线程,以便浏览器可以处理其他紧急事件

3、工作流程

a. React内部三层运转

  • Virtual DOM层,描述页面长什么样子
  • Reconciler层, 负责调用组件生命周期的方法,进行Diff算法
  • Renderer层,根据不同的平台,渲染出相应的页面

b. Fiber Reconciler执行阶段

  • 阶段一,生成Fiber树,得出需要更新的节点信息,渐进过程,可以被打断
  • 阶段二,将需要更新的节点一次过批量更新,不可被打断

c. Fiber

    Reactrender第一次渲染的时候,会通过React.createElement创建一棵Element树,即Virtual DOM Tree

     由于要记录上下文信息,加入了Fiber,每一个Element会对应一个Fiber Node,将Fiber Node连接起来的结构成为了Fiber Tree

     Fiber Tree是链表结构,将递归遍历变成循环遍历(即深度优先搜索),然后配合requestIdleCallback API,实现了任务的拆分、中断和恢复


http://www.ppmy.cn/server/5494.html

相关文章

Set系列集合

Set系列集合特点: Set系列集合特点:无序:添加数据的顺序和获取出的数据顺序不一致;不重复;无索引HashSet无序;不重复;无索引LinkedHashSet有序;不重复;无索引TreeSet排序…

【架构】Elasticsearch+Logstash+Kibana架构

目录 什么是ELK ELK架构的应用场景 什么是ELK ELK是由Elasticsearch、Logstash和Kibana三个开源项目组成的技术栈,广泛用于搜索、日志管理和日志分析。这三个组件协同工作,提供了一个强大的方法来收集、存储、搜索和可视化日志数据和其他时间序列数据…

ADSP-21479的开发详解五(AD1939 C Block-Based Talkthru 48 or 96 kHz)音频直通

硬件准备 ADSP-21479EVB开发板: 产品链接:https://item.taobao.com/item.htm?id555500952801&spma1z10.5-c.w4002-5192690539.11.151441a3Z16RLU AD-HP530ICE仿真器: 产品链接:https://item.taobao.com/item.htm?id38007…

OpenHarmony多媒体-mp3agic

简介 mp3agic 用于读取 mp3 文件和读取/操作 ID3 标签(ID3v1 和 ID3v2.2 到 ID3v2.4),协助开发者处理繁琐的文件操作相关,多用于操作文件场景的业务应用。 效果展示: 下载安装 ohpm install ohos/mp3agicOpenHarmony ohpm环境配…

【Golang】Gin教学-获取请求信息并返回

安装Gin初始化Gin处理所有HTTP请求获取请求的URL和Method获取请求参数根据Content-Type判断请求数据类型处理JSON数据处理表单数据处理文件返回JSON响应启动服务完整代码测试 Gin是一个用Go(又称Golang)编写的HTTP Web框架,它具有高性能和简洁…

Spring 声明式事务控制

1. 编程式事务控制相关对象 1.1 PlatformTransactionManager PlatformTransactionManager 接口是 spring 的事务管理器,它提供了我们常用的操作事务的方法。 PlatformTransactionManager 是接口类型,不同的 Dao 层技术则有不同的实现类。例如:Dao层技…

Linux 下安装MySQL 5.7与 8.0详情

官网资源下载 1、检查 /tmp 临时目录权限,将 /tmp 目录及所有子目录和文件的权限设置为所有用户可读、写和执行 [rootlocalhost ~]# chmod -R 777 /tmp2、安装前检查相关依赖 2.1、查找是否安装了 libaio 包。libaio 是 Linux 下异步 I/O 库的一个实现&#xff0…

【设计模式】6、bridge 桥接模式

六、bridge 桥接模式 桥接设计模式 复杂逻辑拆分: 如果需要完成复杂的逻辑,可以把复杂逻辑设计为接口,内部再拆分为若干接口。这样复杂的逻辑会被拆分开,方便解耦。 例如:如果遥控器控制设备。可以遥控器设计为复杂…