【React】Diff算法

1. React15 Diff算法(递归进行)

一句话概括:新虚拟DOM和旧虚拟DOM对比,找出差异,根据差异更新真实DOM

Diff过程描述:

  1. 树比较(DOM)

同层节点之间相互比较,不会跨层级比较。(当发现节点不存在了,则将该节点及其⼦节点全部删除)

  1. 组件比较(class组件)

不同类型的节点,产生不同的树结构。(节点的类型相同,则按原策略继续比较虚拟DOM,节点的类型不同,移除老节点,创建新节点)

  1. 元素比较(DOM)

同一层级子节点,可以通过 key 来指定那些节点在不同的渲染下保持稳定

2. React16+ Diff算法(Fiber Reconciler,异步可中断)

一句话概括:React17 Diff算法是新JSX对象跟老Fiber树的对比,生成新Fiber的过程

Diff过程描述:

  1. 单节点比较:如果新的子节点(JSX)只有一个元素的话,对应老Fiber是一个或者多个。

1.1 key相同,type相同,复用老Fiber,将老Fiber节点标记为更新;

1.2 key相同,type不同,老Fiber标记删除,根据新的JSX生成新的Fiber,并标记插入;

1.3 key不同,将当前老Fiber标记删除,继续与老Fiber节点的其他兄弟Fiber进行比较。

  1. 多节点比较:如果JSX对象是一个数组的话

第一轮遍历(依次比较):

2.1 依次比较,key和type都相同,全部可复用

2.2 遇到key相同,type不同,不可复用,则将相应老Fiber节点标记删除,根据JSX生成新的Fiber节点

2.3 遇到key不同,直接进入第二轮遍历

2.4 如果JSX对象遍历结束,或者老Fiber遍历结束,进入第二轮遍历

第二轮遍历(分四种情况)

2.5 JSX对象和老Fiber都遍历完了,第二轮遍历直接结束

2.6 JSX对象遍历完了,老Fiber没有遍历完,将剩下老Fiber节点标记删除

2.7 JSX对象没有遍历完,老Fiber遍历完了,根据剩下JSX中元素创建新Fiber,并标记插入

2.8 JSX对象和老Fiber都没有遍历完,根据JSX对象中元素的顺序,对老Fiber进行移动。

所有标记effectTag的Fiber节点形成一条单向链表,在commit阶段,遍历该单向链表,根据effectTag更新真实DOM

相关推荐
Django强哥2 分钟前
JSON Schema Draft-07 详细解析
javascript·算法·代码规范
AndrewHZ3 分钟前
【图像处理基石】GIS图像处理入门:4个核心算法与Python实现(附完整代码)
图像处理·python·算法·计算机视觉·gis·cv·地理信息系统
U.2 SSD23 分钟前
ECharts漏斗图示例
前端·javascript·echarts
江城开朗的豌豆23 分钟前
我的小程序登录优化记:从短信验证到“一键获取”手机号
前端·javascript·微信小程序
excel26 分钟前
Vue Mixin 全解析:概念、使用与源码
前端·javascript·vue.js
杨小码不BUG31 分钟前
蛇形舞动:矩阵填充的艺术与算法(洛谷P5731)
c++·算法·矩阵·csp-j/s·循环控制
MicroTech202541 分钟前
微算法科技(NASDAQ:MLGO)开发延迟和隐私感知卷积神经网络分布式推理,助力可靠人工智能系统技术
人工智能·科技·算法
Never_Satisfied1 小时前
在JavaScript / HTML中,Chrome报错此服务器无法证实它就是xxxxx - 它的安全证书没有指定主题备用名称
javascript·chrome·html
艾小码1 小时前
零基础学JavaScript:手把手带你搭建环境,写出第一个程序!
javascript
Boop_wu2 小时前
[数据结构] Map和Set
java·数据结构·算法