Fiber的深度理解
react15在render阶段的reconcile是不可打断的,这会在进行大量节点的reconcile时可能产生卡顿,因为浏览器所有的时间都交给了js执行,并且js的执行时单线程。为此react16之后就有了scheduler进行时间片的调度,给每个task(工作单元)一定的时间,如果在这个时间内没执行完,也要交出执行权给浏览器进行绘制和重排,所以异步可中断的更新需要一定的数据结构在内存中来保存工作单元的信息,这个数据结构就是Fiber。
那么有了Fiber这种数据结构后,能完成哪些事情呢,
工作单元 任务分解 :Fiber最重要的功能就是作为工作单元,保存原生节点或者组件节点对应信息(包括优先级),这些节点通过指针的形似形成Fiber树
增量渲染:通过jsx对象和current Fiber的对比,生成最小的差异补丁,应用到真实节点上
根据优先级暂停、继续、排列优先级:Fiber节点上保存了优先级,能通过不同节点优先级的对比,达到任务的暂停、继续、排列优先级等能力,也为上层实现批量更新、Suspense提供了基础
保存状态:因为Fiber能保存状态和更新的信息,所以就能实现函数组件的状态更新,也就是hooks
Fiber是一种数据结构
1.React目前的做法是使用链表, 每个 VirtualDOM 节点内部表示为一个Fiber2.从顶点开始遍历3.如果有第一个儿子,先遍历第一个儿子4.如果没有第一个儿子,标志着此节点遍历完成5.如果有弟弟遍历弟弟6.如果有没有下一个弟弟,返回父节点标识完成父节点遍历,如果有叔叔遍历叔叔7.没有父节点遍历结束
Fiber 其实指的是一种数据结构,它可以用一个纯 JS 对象来表示:
const fiber = {stateNode, // 节点实例child, // 子节点sibling, // 兄弟节点return, // 父节点
}
Fiber 树在首次渲染的时候会一次生成。在后续需要 Diff 的时候,会根据已有树和最新 Virtual DOM 的信息,生成一棵新的树。这颗新树每生成一个新的节点,都会将控制权交回给主线程,去检查有没有优先级更高的任务需要执行。如果没有,则继续构建树的过程
如果过程中有优先级更高的任务需要进行,则 Fiber Reconciler 会丢弃正在生成的树,在空闲的时候再重新执行一遍。
在构造 Fiber 树的过程中,Fiber Reconciler 会将需要更新的节点信息保存在Effect List当中,在阶段二执行的时候,会批量更新相应的节点。
Fiber的深度理解相关推荐
- 沈向洋:从深度学习到深度理解
2020-07-30 01:29:20 作者 | 蒋宝尚 编辑 | 丛 末 7月19日,深圳市人工智能与机器人研究院与香港中文大学(深圳)联合主办的"全球人工智能与机器人前沿研讨会" ...
- 深度理解do{} while(0)语句的作用
深度理解do{} while(0) 在linux内核中常常会看到do{} while(0)这样的语句,有人疑惑,认为无意义,因为他只执行一次,加不加do{} while(0)小过失完全一样的,那你就错 ...
- go之树型结构深度理解补充
go之树型结构深度理解补充 在上一篇中借用了 Ilija Eftimov 文章来讲解了tree的定义和一些方法.这篇文章主要是讲解在树型结构中如何判断节点与节点之间的关系. A节点是否是B节点的直接上 ...
- 【TensorFlow】TensorFlow从浅入深系列之二 -- 教你通过思维导图深度理解深层神经网络
本文是<TensorFlow从浅入深>系列之第2篇 TensorFlow从浅入深系列之一 -- 教你如何设置学习率(指数衰减法) TensorFlow从浅入深系列之二 -- 教你通过思维导 ...
- FPGA同步复位与异步复位深度理解
1.1 FPGA同步复位与异步复位深度理解 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA同步复位与异步复位深度理解: 5)结束语. 1.1.2 本节引言 &q ...
- 顺丰不行了吗?对快递行业的深度理解
顺丰不行了吗?对快递行业的深度理解 https://www.toutiao.com/i6950169599203688997/?tt_from=weixin&utm_campaign=clie ...
- 风控算法知识——WOE值的深度理解与应用
导语:WOE值的深度理解与应用看这一篇就够啦!!! 关注"金科应用研院",回复"礼包" 领取风控资料合集 WOE是什么? WOE,全称是"Weight ...
- 深度理解面向对象的基础-抽象(一)
前言: 面向对象这个词对于我们程序开发人员来说,应该都不陌生,我们总说开发要面向对象,但实际上在编写代码的过程中,很多人虽然实现了封装.继承.多态但却不是面向对象的程序设计,而是面向过程的实现逻辑,徒 ...
- 【C语言】深度理解 负数取余 取模
C语言深度理解 负数取余 取模 关于取余和取模的问题 定义 取余时有负数怎么计算? 取余和取模的区别 取余和取模时候等价什么时候不等价 总结 关于取余和取模的问题 许多小伙伴在刚开始学C语言的时候,知 ...
最新文章
- 首届“陇剑杯”网络安全大赛线上赛圆满结束
- htmlentities()与htmlspecialchars()
- 修改最低版本minSdkVersion(转)
- java 判断两个数是否异号
- AI算法连载14:统计之模型选择
- css li 空隙问题
- python 抓取搜狗微信出现的问题,求大神解决
- 验证Java编程环境是否成功时出现“'javac'不是内部或外部命令,也不是可运行的程序或批处理文件”
- 如何在 GitHub 上大显身手?
- Javascript特效:瀑布流
- java Json转string方法
- 软考软件设计师下午真题-面向对象的程序设计与实现-装饰设计模式(2012年上半年试题六))Java代码讲解
- 转《腾讯大讲堂11 拍拍ce工作经验分享》
- winpe装双系统linux_Winpe下安装Ubuntu
- 同样25岁,为什么有人事业有成,有人却一无所有?
- Kruise Rollout:灵活可插拔的渐进式发布框架
- Compose 这次要送 Pixel 5 了!
- 怎样才能在网上快速赚到钱?
- 微服务(二)——注册中心(Eureka、Nacos)
- RDP 协议组件 X.224 在协议流中发现一个错误并且中断了客户端连
热门文章
- 后疫情时代,初创企业生存之策
- AI 时代,为什么程序员很贵?
- 捐赠3亿元驰援疫情后,腾讯再出2亿元发起“战疫开发者公益联盟”
- ICCV 2019 中国论文数量超美国,商汤57篇论文入选!
- Java 13 发布进入倒计时!
- 不止鸿蒙 OS,华为的备用操作系统还有“极光”?
- Python 爬取 50,000 条数据,告诉你五一哪里没有人人人人!(内附折扣景点列表)...
- 京东回应 5000 万用户数据泄露;百度向今日头条索赔 9000 万;腾讯全球专利申请量第二 | 极客头条...
- 996 的程序员,只能云养娃吗?
- 我如何用 21 天在 GitHub 上获取 6300 个 Star?