2.VUE 虚拟DOM-diff算法

120 阅读2分钟

★认识虚拟DOM

数据改变 -> 虚拟DOM(计算变更)【JS浏览器的V8引擎,执行js速度是很快的,比直接操作DOM快很多】 操作真实DOM -> 视图更新

虚拟DOM 就是用JS去模拟DOM

image.png

★虚拟DOM的好处

好处1:减少对真实DOM的操作

通过比较变化,计算最小的需要更新的视图,然后再去操作DOM

好处2:跨平台

虚拟 DOM 本质上是 JavaScript 对象,可以跨平台,例如服务器渲染、Weex 开发等。

snabbdom 虚拟DOM库

A virtual DOM library with focus on simplicity, modularity, powerful features and performance.

【一个虚拟DOM库,关注简单性、模块性、强大功能和性能】

★认识DIFF算法

image.png

DIFF算法:

  • 1.遍历老虚拟DOM
  • 2.遍历新虚拟DOM
  • 3.重新排序

但是如果1000个结点的话,就要计算1000^3,1000 000 000 次, 所以vue react中对DIFF算法进行了优化

vue react优化DIFF算法

1.比较同一个层级

只比较同一个层级,不跨级比较,简化比较次数,

image.png

2.比较标签名

如果标签名不同,直接删除,不继续深度比较

image.png

3.比较key

标签名相同的时候,看key是否相同,这就是v-for的时候加key值, key相同的话就是相同结点,不会再深度比较了

image.png


# 深度剖析:如何实现一个 Virtual DOM 算法


★key的作用

为什么v-for里面需要写key,自己写的li标签不需要写key

自己的理解 如下: “因为v-for的时候,vue或react采用了虚拟DOM进行渲染,而虚拟DOM主要就是DIFF算法, 其中VUE优化了DIFF算法,分别是层级比较,标签比较,还有就是我们说的key比较,所以v-for中需要写key,而自己写的li标签,就直接渲染DOM了,没有使用虚拟DOM,所以不需要写key”

image.png


★v-for的作用

遍历数组

v-for="(item,index) in array" :key="item.id"

遍历对象

v-for="(value,key,index) in Object" :key="key"

v-if v-for

v-for的执行优先级比v-if高,所以不能再同一个标签内使用