diff 算法

diff 算法

参考:https://www.infoq.cn/article/uDLCPKH4iQb0cR5wGY7f

1. 概念

概念:diff 算法是一种优化手段,将前后两个模块进行差异化对比,修补(更新)差异的过程叫做patch(打补丁)

为什么 vue,react 这些框架中都会有 diff 算法呢,我们都知道真实 dom 的开销是很大的,这个跟性能优化中的重绘意义类似。某些时候我们修改了页面中的某个数据,如果直接渲染到真实 DOM 中会引起整棵树的重绘,那么我们能不能只让我们改变过的数据映射到真实 DOM,做一个最少的重绘呢,这就是 diff 算法要解决的事情。

2. virtual DOM和真实DOM的区别

virtual DOM 是将真实的 DOM 的数据抽取出来,以对象的形式模拟树形结构,dif f算法比较的也是virtual DOM

代码理解:

<div>
  <p>Hello World</p>
</div>
// 转换成虚拟节点 类似于下面这种
const Vnode = {
  tag: 'div',
  children: [
    {tag:'p', text:'Hello World'}
  ]
}

3. diff是如何比较的

概括起来就是对操作前后的 dom 树同一层的节点进行对比,一层一层对比,然后再插入真实的 dom 中,重新渲染。

vue中列表循环需加 :key="唯一标识" 唯一标识可以是 item 里面 id index等,因为 vue 组件高度复用增加 Key 可以标识组件的唯一性,那么 key 是如何更高效的更新虚拟 DOM 的呢

我们看下面的例子

图片说明
我们希望可以在 B 和 C 之间加一个 F,diff 算法默认执行起来是这样的:即把 C 更新成 F,D 更新成C ,E 更新成 D,最后再插入 E,是不是很没有效率?

所以我们需要使用 key 来给每个节点做一个唯一标识,Diff 算法就可以正确的识别此节点,找到正确的位置区插入新的节点。

图片说明

Vue.js 文章被收录于专栏

Vue.js

全部评论

相关推荐

06-25 16:00
武汉大学 Java
工科研究生底薪工资就开3k啊??
机械打工仔:写文章提成的岗位工资低,你怪工科?
点赞 评论 收藏
分享
05-09 12:23
已编辑
华南理工大学 Java
野猪不是猪🐗:给他装的,双九+有实习的能看的上这种厂我直接吃⑨✌们拿它练练面试愣是给他整出幻觉了
点赞 评论 收藏
分享
迷茫的大四🐶:自信一点,我认为你可以拿到50k,低于50k完全配不上你的能力,兄弟,不要被他们骗了,你可以的
点赞 评论 收藏
分享
家人们,我现在真的好纠结。我是26届的,目前还没有实习过。我现在的情况是,想参加秋招,但是感觉自己的简历特别空,没有实习经历会不会秋招直接凉凉啊?可我又听说现在很多公司对26届实习生也不太感冒,说什么不确定性大。而且我最近在准备考公,时间上也有点冲突。要是把时间花在实习上,备考时间就少了。但要是不实习,又怕以后就业有问题😫有没有懂行的友友帮我分析分析:26届现在不实习,秋招找工作真的会很难吗?考公和实习该怎么平衡啊?如果现在不实习,考完公再去找实习还来得及吗?真的太焦虑了,希望大家能给我点建议🙏
小破站_程序员YT:我可能和大家的观点不一样。人的精力是有限的,不能既要还要。你又想实习又想考公最后又要秋招上岸,我觉得哪有那么多的选择。你如果想考上岸,那就全力以赴。如果想秋招上岸,就继续投实习,投没了,就继续准备秋招,秋招不行继续春招。别到最后,考公没上岸,觉得是花了时间浪费在找实习上了, 秋招没上岸,觉得是浪费时间准备考公去了。我是认为很难说可以去平衡 不喜勿喷,可以叫我删除
实习与准备秋招该如何平衡
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务