(二)fiber的基本认识

news2024/11/25 4:56:34

上一篇文章我们了解了react新老结构的差异以及存在的缺点,其中react的解决方案就是采用fiber架构和添加Schedule模块。

✍️:Schedule模块的主要工作是任务的调度,负责调度不同优先级任务的执行时机,这个我们后面再讲,这里我们先带大家了解认识一下fiber架构

一、前文回顾

上一篇文章我们说到,fiber主要是为了解决构建虚拟DOM过程中无法中断的问题,同时fiber还解决了旧架构递归更新时产生的性能问题。

二、JSX

在了解fiber之前,我们先来认识一个跟fiber有关联的知识,就是JSX,如果你使用过react,那么你肯定使用过JSX这种数据结构,JSX可以让我们以近乎编写JS原生的方式进行编码,而JSX对象会经过babel转换reactElement这种数据结构,最终通过这种数据结构,生成fiber节点,所以他们两个之间的关系就是:JSX -> fiber,也可以理解成JSX 驱动 fiber

转换结果

其中key就是我们常用的key属性,props就是我们传入的一些参数,比如经常传递给组件的props,当然如果有子节点的话,那么子节点也会在这个props对象中,key为children。

三、fiber的结构

了解完JSX和fiber的关系后,我们接着来了解一下fiber的具体结构。fiber是react对VDOM的一个实现,其实fiber就是一个JS中的对象,但是这个对象中存在着许多的属性。

了解完大概的结构之后我们来了解一下fiber的含义,这里引用React技术揭秘中的一段解释

Fiber包含三层含义:

1.作为架构来说,之前React15Reconciler采用递归的方式执行,数据保存在递归调用栈中,所以被称为stack ReconcilerReact16Reconciler基于Fiber节点实现,被称为Fiber Reconciler
2.作为静态的数据结构来说,每个Fiber节点对应一个React element,保存了该组件的类型(函数组件/类组件/原生组件…)、对应的DOM节点等信息。
3.作为动态的工作单元来说,每个Fiber节点保存了本次更新中该组件改变的状态、要执行的工作(需要被删除/被插入页面中/被更新…)。

四、fiber解决的问题

我们开头说到了,fiber可以解决旧架构存在的性能问题,那么fiber是如何解决的呢?

🙁:我们知道之前的更新是通过递归同步的方式进行更新,也就是说如果有一个地方发生了变化,就会通知渲染器操作DOM节点进行更新,这样就会存在频繁的操作DOM的过程。

😊:而fiber除了支持异步中断更新之外,还更换了一种更新的方式,也就是双缓存更新机制,大概可以理解为react内部会维护两棵树,一颗是当前页面上存在的树,一颗是发生更新时内存中构建的树,通过指针切换两颗树,从而改变页面上的UI状态,这就是fiber的双缓存机制,也就是fiber的工作机制这两棵树都是由fiber节点连接形成的树,也可以称为fiber树。

通过这种机制,我们可以不用频繁的去执行DOM操作,我们可以将更新时需要发生变化的地方打上标签,当内存中这颗树构建完成时,我们就可以拿到一颗完整的fiber树,这颗树中记录着需要发生变化的节点,然后统一提交给渲染器一并渲染。

五、总结

这一篇我们大概了解了JSX与fiber的关系fiber的整体结构以及从宏观的角度了解了fiber的工作机制,下一篇文章我们会从源码的角度来理解fiber节点的创建过程,是如果通过JSX对象最后生成为fiber节点的,敬请期待!🥸

最后

为大家准备了一个前端资料包。包含54本,2.57G的前端相关电子书,《前端面试宝典(附答案和解析)》,难点、重点知识视频教程(全套)。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

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

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

相关文章

Ardor公链生态与Jelurida产业区块链布局

Ardor公链 Ardor公链(ARDR)基于NXT公链,并于2018年1月1日推出了多链架构,旨在克服单链本质上的局限性。根据Ardor平台的白皮书,其主要目标是: 解决最终用户必须拥有作为手续费(Gas费&#xff…

FineReport复杂表格软件- 相对层次坐标

1. 概述 相对层次坐标是用来描述目标单元格和当前单元格之间的位置关系的表达式,概念图如下图所示: 说明: 参数 说明 Cellx 表示需要返回结果的单元格 Celly 表示位移时参考的单元格 z 代表相对位移的位置 注:相对后移需要…

【Linux】必须掌握的Linux常见指令分类讲解

目录一.Linux下的文件树二.工作目录切换命令1.ls——显示当前路径下的文件和目录2.pwd——显示当前目录的绝对值路径3.cd——切换至指定目录三.文件目录管理命令1.touch——创建空文件2.tree——树状打印目录3.mkdir——创建目录4.rmdir 和 rm ——删除目录5.cp——拷贝文件或目…

Python编程小白入门技巧,从入门到精通只需一个月。

毫无疑问,Python 是当下最火的编程语言之一。对于许多未曾涉足计算机编程的领域「小白」来说,深入地掌握 Python 看似是一件十分困难的事。其实,只要掌握了科学的学习方法并制定了合理的学习计划,Python 从 入门到精通只需要一个月…

【iOS】接口与API设计

文章目录前言用前缀避免命名空间冲突提供“全能初始化方法”实现description方法尽量使用不可变对象使用清晰而协调的命名方式方法命名类与协议的命名为私有方法名加前缀理解Objective-C错误模型理解NSCopying协议前言 我们在构建程序应用时,如果决定重用代码&…

DPDK 网卡驱动学习

DPDK版本19.02 初始化: /* Launch threads, called at application init(). */ int rte_eal_init(int argc, char **argv) {.../* rte_eal_cpu_init() ->* eal_cpu_core_id()* eal_cpu_socket_id()* 读取/sys/devices/system/[cpu|node]* 设置lcore_con…

考试管理系统

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字): 模块划分:老师模块、班级模块、学生模块、课程模块、试题模块、试卷模块、 组卷模块、考试模块、答题模块 管…

Python数据分析实战之用户消费行为数据分析

任务1:数据预处理 表格数据资源如下百度网盘👇 链接:https://pan.baidu.com/s/1pUYfRIe557v6O9ByB2rhEw 提取码:ovgl import numpy as np import pandas as pd import matplotlib.pyplot as plt # %matplotlib inline # 更改绘…

OrangePi 5 Docker下安装OpenWRT作软路由(同样适用于树莓派等设备)

OrangePi5 Docker下安装OpenWRT作软路由(同样适用于树莓派等设备) 说明 本文的软路由作为家中的二级路由,用一根网线连接主路由的LAN口和二级路由的WAN口(当主路由使用配置类似) 如果你想要作为旁路由或中继路由使用…

VUE中render渲染函数(h函数)

vue在绝大多数情况下都推荐使用模板来编写html结构,但是对于一些复杂场景下需要完全的JS编程能力,这个时候我们就可以使用渲染函数 ,它比模板更接近编译器 vue在生成真实的DOM之前,会将我们的节点转换成VNode,而VNode组合在一起形…

巡更标签 “ PE29_BLE_XG

在我们日常中有一些场景涉及到打卡,比如一个设备需要维护,需要每天有工作人员到现场进行检查或者维护操作,目前普通的做法是弄个二维码到场扫码或者本子记录,用记录的方式明显太落后,容易导致监管不好操作,…

STM32 51单片机——搭建keil5的开发环境(ARM)

知识点:keil/proteus搭建概述、环境搭建 实训day1——12月19日 目录 1 keil安装 1.1 安装KEIL5 安装包 步骤1: 步骤2: 步骤3: 步骤4: 步骤5: 1.2 添加License 步骤1: 步骤2&#xff…

LabVIEW中忽略特定错误

LabVIEW中忽略特定错误 在LabVIEW中收到错误,但已经确认它不会对我的应用程序产生负面影响。如何忽略或清除此错误? LabVIEW程序因为出现错误而中止,但希望代码在收到此错误后继续。怎样才能做到这一点? 解决方案 忽略错误有三…

实验9 利用Wireshark软件分析DHCP

目录 一、实验目的及任务 二、实验环境 三、预备知识 四、实验步骤 五、实验报告内容 一、实验目的及任务 1.通过协议分析进一步明确DHCP报文格式中各字段语法语义; 2.进一步明确DHCP工作原理并能够描述 二、实验环境 联网的计算机;主机操作系…

iead中安装Lombok插件、Lombok注解的使用

Lombok插件安装&#xff1a; 1.pom.xml引入Lombok依赖包&#xff1a; <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.10</version></dependency>2.file-setting: 安装Lom…

Python中变量的定义和使用规则

一、如何理解Python中的变量 在解释变量这个东东之前&#xff0c;我先给大家看一组代码&#xff0c;如下图&#xff1a; 上图里面&#xff0c;a作为变量&#xff0c;每次存放的数据和数据类型都不同。看到这里大部分人应该明白了&#xff0c;变量就是随时都可以改变的量&#…

[附源码]计算机毕业设计Python的桌游信息管理系统(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

UG/NX二次开发Siemens官方NXOPEN实例解析—2.2 Selection

列文章目录 UG/NX二次开发Siemens官方NXOPEN实例解析—2.1 AssemblyViewer UG/NX二次开发Siemens官方NXOPEN实例解析—2.2 Selection 列文章目录 文章目录 前言 一、知识点提取 二、案例需求分析 三、程序分析 总结 前言 随着工业智能化的不断发展&#xff0c;UG二次开…

代码随想录训练营第十二天

专题&#xff1a;栈和队列 题目&#xff1a;滑动窗口最大值 给定一个数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 题目解析&#xff1a;…

【Flink实时数仓】数据仓库项目实战 《五》流量域来源关键词粒度页面浏览各窗口汇总表 【DWS】

文章目录【Flink实时数仓】数据仓库项目实战 《五》流量域来源关键词粒度页面浏览各窗口汇总表 【DWS】1.1流量域来源关键词粒度页面浏览各窗口汇总表&#xff08;FlinkSQL&#xff09;1.1.1 主要任务1.1.2 思路分析1.1.3 图解1.1.4 代码【Flink实时数仓】数据仓库项目实战 《五…