diff算法

237 阅读1分钟

是什么?

是一种高效的算法,用来对比新旧vnode,然后根据差异操作真实dom。

对比策略

  • 深度优先,同层比较
  • 比较过程中循环从两边向中间靠拢,首尾做四次对比,前前后后 前后后前

原理分析

通过对比新旧两个节点,以及两个节点的子节点...判断怎么去更新 就不会重新创建DOM节点,而是在原有的DOM节点上进行修补,尽可能复用原有的DOM节点。

template:
<div class="container"> <h1>Hello World</h1> <p>Lorem ipsum dolor sit amet.</p> </div>

对应的vnode:
{ 
    tag: 'div', 
    props: { class: 'container' }, 
    children: [ { tag: 'h1', props: {}, children: 'Hello World' }, { tag: 'p', props: {}, children: 'Lorem ipsum dolor sit amet.' } ] 
}

v-for中key的作用:

先比较key 然后tag,如果都相等则 值得比较,v-for才有key 普通元素没有key,没有key的元素默认是相等的 都是undefined

举个例子:

假设list=[1,2,3,4,5] 后来变成list=[0,1,2,3,4,5]

<ul>
    <li v-for="item in list">{{item}}</li>
</ul>

没有key的情况下,对比之后是相同节点就会更新节点的text,每一项都会这样操作,最后再新增一个5节点

如果有key的情况下,比较key和tag之后首位不是同一个节点就会按照diff算法继续比较,比较完之后最后的操作是在首位新增了0节点,其他节点复用,这样就提高了性能。

注意:key要唯一,不要用index,不然会出现不该复用的时候复用,比如删除第一个元素,key如果用到index,最后比较完结果是删除了最后一个元素。

github.com/febobo/web-…

www.cnblogs.com/goloving/p/…