[vue.js设计和实现]简单的Dom Diff算法

简介: [vue.js设计和实现]简单的Dom Diff算法

今天翻看了vue.js设计和实现的第九章内容,主要是谈论Dom的Diff算法。因为实际操作dom的开销很大,所以有dom的Diff算法来减小操作dom的次数,来提高性能。


一.比较标签元素



通过比较标签的元素,来减少操作dom的次数。只要新旧子节点中的标签相同,我们就只更新节点的内容就可以


二.新旧子节点的数量不同



第一点中,我们默认了新旧子节点的数量是一样的,但是实际中我们可以要卸载或挂载上节点。这时候我们应该比较新旧节点的数量,遍历数量少的那一组节点,然后再判断剩余节点是应该挂载上还是卸载掉


三.Dom复用和key



如果新旧子节点的标签相同,只是顺序不一样。难道我们还应该在全部卸载再挂载上去吗?其实我们只需要移动节点的顺序,便可达到同样的效果。但是移动的前提是我们必须找到可以复用的子节点,所以我们要进行一轮对比操作,判断旧的子节点中有没有可以复用的。假如我们还是通过标签的方式来进行判断,若新旧子节点中的标签是一样的,那么我们无法知道这个新节点中的标签对应到旧节点中的标签是哪一个,也就无法得知我们应该如何移动,所以我们引入了key,只要两个虚拟节点的 type 属性值和 key 属性值都相同,那么我们就认为它们是相同的,即可以 进行 DOM 的复用。


四.如何移动



1.找到需要移动的元素


逆向思维,什么时候不需要移动元素。当新旧子节点的顺序相对不变的时候,我们便不需要移动元素。使用lastIndex记录新节点在旧节点中的最大索引值,如果索引值递增的顺序被打破,则需要移动该元素。


2.如何移动


通过改变引用的方式


image.png

改变引用后


image.png


添加新元素


如果有前一个 vnode 节点,则使用它的下一个兄弟节点作为锚点元素,如果没有前一个 vnode 节点,说明即将挂载的新节点是第一个子节。


删除元素


当基本的更新结束时,我们需要遍历旧的一组子节点,然后去新的一组子节 点中寻找具有相同 key 值的节点。如果找不到,则说明应该删除该节 点


目录
相关文章
|
2月前
|
JavaScript 前端开发 Go
CSS 与 JS 对 DOM 解析和渲染的影响
【10月更文挑战第16天】CSS 和 JS 会在一定程度上影响 DOM 解析和渲染,了解它们之间的相互作用以及采取适当的优化措施是非常重要的。通过合理的布局和加载策略,可以提高网页的性能和用户体验,确保页面能够快速、流畅地呈现给用户。在实际开发中,要根据具体情况进行权衡和调整,以达到最佳的效果。
|
1月前
|
JavaScript 前端开发 索引
js中DOM的基础方法
【10月更文挑战第31天】这些DOM基础方法是操作网页文档结构和实现交互效果的重要工具,通过它们可以动态地改变页面的内容、样式和行为,为用户提供丰富的交互体验。
|
1月前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
49 5
|
1月前
|
JavaScript 前端开发 开发者
.js的dom元素操作
【10月更文挑战第29天】通过灵活运用这些 DOM 元素操作方法,JavaScript 可以实现丰富的网页交互效果,如动态更新页面内容、响应用户操作、创建和删除页面元素等。在实际开发中,开发者可以根据具体的需求和场景,选择合适的 DOM 元素操作方法来实现所需的功能,为用户提供更加流畅和动态的网页体验。
|
2月前
|
算法 JavaScript UED
Diff 算法的实现原理
【10月更文挑战第18天】Diff 算法是 Vue.js 中实现高效 DOM 更新的核心机制,通过合理的比较和优化策略,能够在保证界面正确性的同时,最大程度地减少 DOM 操作,提高应用的性能和用户体验。
42 2
|
2月前
|
算法 JavaScript
Vue 中的 Diff 算法
【10月更文挑战第18天】需要注意的是,Diff 算法虽然能够提高性能,但在某些复杂的场景下,可能仍然会存在一些性能瓶颈。因此,在实际开发中,我们需要根据具体情况合理地使用 Diff 算法,并结合其他优化手段来提高应用的性能。
21 1
|
2月前
|
JavaScript 算法 前端开发
vue 中diff算法
【10月更文挑战第10天】
43 1
|
2月前
|
移动开发 JavaScript 前端开发
原生js如何获取dom元素的自定义属性
原生js如何获取dom元素的自定义属性
85 4
|
2月前
|
JavaScript 前端开发 容器
js之dom学习
js之dom学习
48 0
|
7月前
|
XML JavaScript 前端开发
Javaweb之javascript的DOM对象的详细解析
1.5.3 DOM对象 1.5.3.1 DOM介绍 DOM:Document Object Model 文档对象模型。也就是 JavaScript 将 HTML 文档的各个组成部分封装为对象。
80 0