当前位置: 首页 > news >正文

[React源码解析] Fiber (二)

在React15及以前, Reconciler采用递归的方式创建虚拟Dom, 但是递归过程不可以中断, 如果组件的层级比较深的话, 递归会占用线程很多时间, 那么会造成卡顿。

为了解决这个问题, React16将递归的无法中断的更新重构为异步的可中断更新, Fiber架构诞生。

文章目录

      • 1.Fiber的结构
      • 2.作为架构来说
      • 3.作为静态的数据结构
      • 4.作为动态的工作单元

1.Fiber的结构

作为架构来说, 之前React15的Reconciler采用递归的方式执行, 数据保存在递归调用栈中, 称为Stack Reconciler, React16的Reconciler基于Fiber节点实现, 称为Fiber Reconciler。

作为静态的数据结果来说, 每个Fiber节点对应一个组件, 保持了该组件的类型(函数组件/类组件/原生组件)和对应的DOM节点信息。

作为动态的工作单元来说, 每个Fiber节点保持了本次更新中该组件改变的状态, 要执行的工作(需要被删除/被插入页面中/被更新)。

function FiberNode(tag: WorkTag,pendingProps: mixed,key: null | string,mode: TypeOfMode,
) {// 作为静态数据结构的属性this.tag = tag;this.key = key;this.elementType = null;this.type = null;this.stateNode = null;// 用于连接其他Fiber节点形成Fiber树this.return = null;this.child = null;this.sibling = null;this.index = 0;this.ref = null;// 作为动态的工作单元的属性this.pendingProps = pendingProps;this.memoizedProps = null;this.updateQueue = null;this.memoizedState = null;this.dependencies = null;this.mode = mode;this.effectTag = NoEffect;this.nextEffect = null;this.firstEffect = null;this.lastEffect = null;// 调度优先级相关this.lanes = NoLanes;this.childLanes = NoLanes;// 指向该fiber在另一次更新时对应的fiberthis.alternate = null;
}

2.作为架构来说

作为架构来说, 每一个Fiber节点对应一个组件, 多个Fiber形成树。

// 指向父级Fiber节点
this.return = null;
// 指向子Fiber节点
this.child = null;
// 指向右边第一个兄弟Fiber节点
this.sibling = null;
function App() {return (<div>i am<span>KaSong</span></div>)
}

对应的Fiber树:

在这里插入图片描述

作为一个工作单元, return指节点执行完completeWork后返回的下一个节点。子Fiber节点以及兄弟节点完成工作后返回其父级节点, 故return代替父节点。

3.作为静态的数据结构

// Fiber对应组件的类型 Function/Class/Host...
this.tag = tag;
// key属性
this.key = key;
// 大部分情况同type,某些情况不同,比如FunctionComponent使用React.memo包裹
this.elementType = null;
// 对于 FunctionComponent,指函数本身,对于ClassCompoent,指class,对于HostComponent,指DOM节点tagName
this.type = null;
// Fiber对应的真实DOM节点
this.stateNode = null;

4.作为动态的工作单元

// 保存本次更新造成的状态改变相关信息
this.pendingProps = pendingProps;
this.memoizedProps = null;
this.updateQueue = null;
this.memoizedState = null;
this.dependencies = null;this.mode = mode;// 保存本次更新会造成的DOM操作
this.effectTag = NoEffect;
this.nextEffect = null;this.firstEffect = null;
this.lastEffect = null;

与调度优先级有关的属性:

// 调度优先级相关
this.lanes = NoLanes;
this.childLanes = NoLanes;

相关文章:

  • mfc140.dll找不到了要怎么解决?教你多种修复mfc140.dll的方法
  • C语言——如何进行文件操作
  • [k8s系列]:kubernetes·概念入门
  • C++中 this指针、构造函数、析构函数
  • 数据结构系统刷题
  • 【vue】图片加载骨架
  • 如何做好一份全面的市场调查报告?
  • 2024年数学建模美赛 分析与编程
  • USB-C显示器:未来显示技术的革新者
  • 【Docker】linux、nginx、容器镜像三者基本概念
  • Windows系统安装OpenSSH+VS Code结合内网穿透实现远程开发
  • 【论文阅读】Long-Tailed Recognition via Weight Balancing(CVPR2022)附MaxNorm的代码
  • Android Handler完全解读
  • C语言 | 求最大/小值小技巧:fmax、fmin函数
  • 正则表达式 文本三剑客
  • __proto__ 和 prototype的关系
  • 【node学习】协程
  • 3.7、@ResponseBody 和 @RestController
  • 77. Combinations
  • canvas 高仿 Apple Watch 表盘
  • Java 23种设计模式 之单例模式 7种实现方式
  • JavaScript 基础知识 - 入门篇(一)
  • Octave 入门
  • react 代码优化(一) ——事件处理
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • vue.js框架原理浅析
  • win10下安装mysql5.7
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 猴子数据域名防封接口降低小说被封的风险
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 蓝海存储开关机注意事项总结
  • 问题之ssh中Host key verification failed的解决
  • 我感觉这是史上最牛的防sql注入方法类
  • 想写好前端,先练好内功
  • 责任链模式的两种实现
  • Java性能优化之JVM GC(垃圾回收机制)
  • #宝哥教你#查看jquery绑定的事件函数
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (Git) gitignore基础使用
  • (二)构建dubbo分布式平台-平台功能导图
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (一)Thymeleaf用法——Thymeleaf简介
  • (一)基于IDEA的JAVA基础10
  • (转)3D模板阴影原理
  • (转)EXC_BREAKPOINT僵尸错误
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .Net MVC4 上传大文件,并保存表单
  • .net 使用ajax控件后如何调用前端脚本
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET项目中存在多个web.config文件时的加载顺序
  • .NET学习教程二——.net基础定义+VS常用设置
  • [.net] 如何在mail的加入正文显示图片