[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 值的节点。如果找不到,则说明应该删除该节 点


目录
相关文章
|
5天前
|
JavaScript 前端开发 算法
React技术栈-虚拟DOM和DOM diff算法
这篇文章介绍了React技术栈中的虚拟DOM和DOM diff算法,并通过一个实际案例展示了如何使用React组件和状态管理来实现动态更新UI。
19 2
|
8天前
|
JavaScript 前端开发 算法
react中虚拟dom和diff算法
在React中,虚拟DOM(Virtual DOM)和Diff算法是两个核心概念,它们共同工作以提高应用的性能和效率。
19 4
|
9天前
|
JavaScript 算法 前端开发
JS算法必备之String常用操作方法
这篇文章详细介绍了JavaScript中字符串的基本操作,包括创建字符串、访问特定字符、字符串的拼接、位置查找、大小写转换、模式匹配、以及字符串的迭代和格式化等方法。
JS算法必备之String常用操作方法
|
9天前
|
JavaScript 算法 前端开发
JS算法必备之Array常用操作方法
这篇文章详细介绍了JavaScript中数组的创建、检测、转换、排序、操作方法以及迭代方法等,提供了数组操作的全面指南。
JS算法必备之Array常用操作方法
|
9天前
|
前端开发 算法 JavaScript
React原理之Diff算法
【8月更文挑战第24天】
|
6天前
|
JavaScript 前端开发
JavaScript 与 DOM 交互
【9月更文挑战第01天】
9 2
|
12天前
|
编解码 JavaScript 前端开发
JS逆向浏览器脱环境专题:事件学习和编写、DOM和BOM结构、指纹验证排查、代理自吐环境通杀环境检测、脱环境框架、脱环境插件解决
JS逆向浏览器脱环境专题:事件学习和编写、DOM和BOM结构、指纹验证排查、代理自吐环境通杀环境检测、脱环境框架、脱环境插件解决
31 1
|
17天前
|
JSON JavaScript 前端开发
JS的无限可能: 前端 精妙DOM技巧至Node.js的服务端
JS的无限可能: 前端 精妙DOM技巧至Node.js的服务端
|
18天前
|
JavaScript 算法 前端开发
"揭秘Vue.js的高效渲染秘诀:深度解析Diff算法如何让前端开发快人一步"
【8月更文挑战第20天】Vue.js是一款备受欢迎的前端框架,以其声明式的响应式数据绑定和组件化开发著称。在Vue中,Diff算法是核心之一,它高效计算虚拟DOM更新时所需的最小实际DOM变更,确保界面快速准确更新。算法通过比较新旧虚拟DOM树的同层级节点,递归检查子节点,并利用`key`属性优化列表更新。虽然存在局限性,如难以处理跨层级节点移动,但Diff算法仍是Vue高效更新机制的关键,帮助开发者构建高性能Web应用。
32 1
|
4月前
|
缓存 JavaScript 前端开发
【JavaScript 技术专栏】DOM 操作全攻略:从基础到进阶
【4月更文挑战第30天】本文深入讲解JavaScript与DOM交互,涵盖DOM基础、获取/修改元素、创建/删除元素、事件处理结合及性能优化。通过学习,开发者能掌握动态改变网页内容、结构和样式的技能,实现更丰富的交互体验。文中还讨论了DOM操作在实际案例、与其他前端技术结合的应用,助你提升前端开发能力。
172 0
下一篇
DDNS