IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> vue的diff算法讲解 -> 正文阅读

[JavaScript知识库]vue的diff算法讲解

当数据发生变化时,vue是怎么运作的?

vue会根据真实DOM生成virtual dom,当虚拟DOM节点数据变化时会生成一个新的vnode,然后vnode和oldVnode作对比,如果有不一样的地方就直接修改在真实的dom上,然后将oldVnode更新为vnode,diff的过程就是调用patch(打补丁)函数,比较新旧节点,一边比较一边给真实的DOM打补丁

虚拟DOM和真实DOM都是什么样的?

<div>
	<span>我是真实DOM<</span>
</div>
let vnode = {
	tag: 'div',
	children: [
		{tag: 'span', text: '我是虚拟DOM'}
	]
}

vue的diff只会比较新旧节点,并且只会在同级比较,不会进行跨层级比较

diff过程

在学习diff的过程前,我们需要知道当数据发生变化,会触发obderve中的set方法,set方法会调用Dep.notify通知所有订阅者watcher,订阅者就会调用patch给真实的DOM打补丁(对Vue的observe、watch、compile概念不清楚的可以去看我的vue双向绑定原理文章)

在这里插入图片描述

在patchVnode方法中还调用了一个方法updateChildren

  • 这个方法将vnode的子节点vCh和oldVnode的子节点oldCh作对比进行更新,简单来说就是,将旧节点集合以新节点集合为标准调整

  • oldCh和vCh各有两个头尾的变量StartIdx和EndIdx,它们的2个变量相互比较,一共有4种比较方式。如果4种比较都没匹配,如果设置了key,就会用key进行比较,在比较的过程中,变量会往中间靠,一旦StartIdx>EndIdx表明oldCh和vCh至少有一个已经遍历完了,就会结束比较

大家来跟我看图就明白了
在这里插入图片描述
oldVnode是更新前的节点,vnode是更新后的节点,那么我们来看看,旧节点集合是怎么根据新节点集合来进行调整的

第一步:
在这里插入图片描述

现在分别对oldS、oldE、S、E两两做sameVnode比较,有四种比较方式,当其中两个能匹配上那么真实dom中的相应节点会移到Vnode相应的位置

  • 如果是oldS和E匹配上了,那么真实dom中的第一个节点会移到最后
  • 如果是oldE和S匹配上了,那么真实dom中的最后一个节点会移到最前,匹配上的两个指针向中间移动
  • 如果四种匹配没有一对是成功的,那么遍历oldChild,S挨个和他们匹配,匹配成功就在真实dom中- 将成功的节点移到最前面,如果依旧没有成功的,那么将S对应的节点插入到dom中对应的oldS位置,oldS和S指针向中间移动。

第二步:
a = oldS, c = oldE
a = s, b = e
oldS和s匹配上了,但是都在第一个,所以不用做任何操作
此时DOM为a b d
,最后oldS指针和s指针向内部移动oldS指向旧集合的b,s指向新集合的c

第三步:
在这里插入图片描述
b = oldS, d = oldE
c = s, b = e
发现oldS指针和e指针指向的内容匹配,所以将旧集合中的b元素移动到最后 (当其中两个能匹配上那么真实dom中的相应节点会移到Vnode相应的位置)
此时DOM为a d b
,最后oldS指针和e指针向内部移动oldS指向旧集合的d,e指向新集合的d

第四步:
在这里插入图片描述
d = oldE, d = oldS
c = s, d = e
发现oldE和d是匹配的,位置不变
然后oldS++ ,oldE-- oldS > oldE,遍历结束,说明oldCh先遍历完,将剩余的节点按照自己的index插入到真是dom中,此时DOM为a d d b

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-18 17:32:12  更:2022-04-18 17:34:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:45:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码