周分享

vue-diff算法——周分享

2020-03-06  本文已影响0人  橙汁坤

当数据发生变化时,vue是怎么更新节点的?

之前,正常用jq等其他库的时候渲染列表都是直接把整个列表数据添加到dom中,即使列表数据新增一条,会把以前的列表全部替换成新的列表数据,当我们需要在各个事件方法中直接操作DOM来达到修改视图的目的。但是当应用一大就会变得难以维护。

diff算法的优越性到底体现在哪?

Vue.js将DOM抽象成一个以JavaScript对象为节点的虚拟DOM树,以VNode节点模拟真实DOM,可以对这颗抽象树进行创建节点、删除节点以及修改节点等操作,在这过程中都不需要操作真实DOM,经过diff算法得出一些需要修改的最小单位,再将这些小单位的视图进行更新。这样做减少了很多不需要的DOM操作,它是对真实Dom的一层抽象.

image.png
<div>
    <p>123</p>
</div>

<div>
    <span>456</span>
</div>

diff算法的比较只会在span层,当数据发生改变时,set方法会让调用Dep.notify通知所有订阅者Watcher,订阅者就会调用patch给真实的DOM打补丁,更新相应的视图。

diff算法是通过同层的树节点进行比较而非对树进行逐层搜索遍历的方式,所以时间复杂度只有O(n),是一种相当高效的算法。


image.png

diff流程图
当数据发生改变时,set方法会让调用Dep.notify通知所有订阅者Watcher,订阅者就会调用patch给真实的DOM打补丁,更新相应的视图。

上一篇下一篇

猜你喜欢

热点阅读