问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

React之Diff算法

发布网友 发布时间:2022-11-29 01:00

我来回答

1个回答

热心网友 时间:2023-10-25 06:03

diff算法的作用
计算出Virtual DOM中真正变化的部分,并只针对该部分进行原生DOM操作,而非重新渲染整个页面。

传统diff算法
通过循环递归对节点进行依次对比,算法复杂度达到 O(n^3) ,n是树的节点数,这个有多可怕呢?——如果要展示1000个节点,得执行上亿次比较。。即便是CPU快能执行30亿条命令,也很难在一秒内计算出差异。

diff算法
React 通过制定大胆的策略,将 O(n^3) 复杂度的问题转换成 O(n) 复杂度的问题。

diff 策略

两棵树只会对同一层次的节点进行比较。
既然 DOM 节点跨层级的移动操作少到可以忽略不计,React只会对同级节点进行比较。当发现节点已经不存在,则该节点及其子节点会被完全删除掉,不会用于进一步的比较。这样只需要对树进行一次遍历,便能完成整个 DOM 树的比较。

最高效的算法应该是直接将 A 子树移动到 D 节点,但这样就涉及到跨层级比较,时间复杂度会陡然上升。React 的做法比较简单,它会先删除整个 A 子树,然后再重新创建一遍。结合到实际的使用场景,改变一个组件的从属关系的情况也是很少的。
注意:在开发组件时,保持稳定的 DOM 结构会有助于性能的提升。例如,可以通过 CSS 隐藏或显示节点,而不是真的移除或添加 DOM 节点。

同样道理,当 D 组件改为 G 组件时,整棵 D 子树也会被删掉,E、F 节点会重新创建。

三种方法:插入,移动,删除
INSERT_MARKUP插入,新的 component 类型不在老集合里, 即是全新的节点,需要对新节点执行插入操作。

MOVE_EXISTING移动,在老集合有新 component 类型,且 element 是可更新的类型,这种情况下 prevChild=nextChild,就需要做移动操作,可以复用以前的 DOM 节点。

REMOVE_NODE删除,老 component 类型,在新集合里也有,但对应的 element 不同则不能直接复用和更新,需要执行删除操作,或者老 component 不在新集合里的,也需要执行删除操作。

对于列表的 Diff,节点的 key 有助于节点的重用:

如上图所示,当没有 key 的时候,如果中间插入一个新节点,Diff 过程中从第三个节点开始的节点都是删除旧节点,创建新节点。当有 key 的时候,除了第三个节点是新创建外,第四和第五个节点都是通过移动实现的。

为什么会有上述两种情况的区别呢?

对于第一种情况:

key = {index}在更新前后是相同的,都是1,2,3

但是对比,key相同时,元素不同,则删除插入

对于第二种情况;

key = {item} key分别是 'll','ww','kk' ,更新后虚拟dom key分别是kk ll ww,在进行element diff时,发现kk元素节点在更新前后是相同的,无需创建,会进行移动

说明:

对于第一种情况,其实和没有key是一样的,除非其顺序和key保持一致;

针对这一现象,React 提出优化策略:允许开发者对同一层级的同组子节点,添加唯一 key 进行区分,虽然只是小小的改动,性能上却发生了翻天覆地的变化!

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
给好闺蜜的祝福语 怎样提高手机app的打开速度 ...使用过程中哪些情况必须送检,和最好送检。送检物如何取? 为什么从别的电脑上拷贝的OFFICE文件在自己的电脑上打不开? 蚊香忘记灭了会着火吗-蚊香没灭会把东西烧着吗 怎么每天孩子(27)一起床,家长就开始催刷牙,孩子没有刷的话就各种说教... 为什么有人午休起床要刷牙? 我想买一副塔罗牌,我只是想学一下,入门即可。包头哪里有卖的 我想学习塔罗牌,不知道要怎么入门,谁能推荐一下买什么书,买什么牌子... 泉州哪里可以 学塔罗牌 前端react如何实现静默打印 【React Native】自定义格式的资源文件引入及使用 react项目tsconfig不生效 React添加水印 上海富大同诺环境科技有限公司怎么样? 中山市富大照明科技有限公司怎么样? 江苏富大环境科技有限公司怎么样? 每天早晚敷面膜倒不好 每天早晚敷面膜有什么坏处 你对故乡有着怎样特殊的情感? 回到故乡是什么感觉? 大班孝亲宝宝星级评选表,怎么写 我想问一下微信视频镜像能解决吗 微信什么时候普及镜像功能 参加“2011佳缘宝宝评选活动”要有哪些条件? 更换微信镜像图标怎么弄 血压低到70 计算机五月考试需要重新报名的几个省 FL∪KE179进口万用表价格? 求三清山的门票价格,,以及东部索道,,南部索道的价格? 推荐帖!4000元以下适合妈妈的手机,还不给你妈换机吗? 瞥是会意字吗 王者荣耀鬼谷子连招玩法教学视频 大招什么时 鬼谷子是如何教育学生的? 超威蚊香液好用吗?超威蚊香液效果好吗? 超威蚊香液怎么用?超威蚊香液用法 ipad mini 换外屏多少钱 酷家乐复式一层二层怎么连接 酷家乐软件能设计复式房吗 个位朋友好呀!! 篮球有多少个规定呀 什么走步。。抱球几次犯规呀。。。。 我是小学生 弥勒有到版纳的高铁吗? 哈尔滨到西双版纳火车时刻表? 西双版纳到红河州有高铁吗 “全行业领跑者”的广告违法吗 中国银行业百强名单谁有? 银行有哪几大家,并带排名,10名以内。 经典的电气电工行业广告词 CS游戏是什么时候诞生的 青岛法院线上开庭用什么软件 cs的由来 越详细越好 西红柿吃了会上火吗 西红柿吃了会拉肚子吗