当我点击按钮时会在中间插入一个f
<div id="app"></div>
<template id="my-app">
<ul>
<li v-for="item in letters">{{item}}</li>
</ul>
<button @click="insertF">insert f</button>
</template>
<script src="../js/vue.js"></script>
<script>
const App = {
template: '#my-app',
data() {
return {
letters: ['a', 'b', 'c', 'd']
}
},
methods: {
insertF() {
this.letters.splice(2, 0, 'f');
}
}
}
Vue.createApp(App).mount('#app');
</script>
我们可以确定的是,这次更新对于ul和button是不需要进行更新,需要更新的是我们li的列表:
那么Vue中对于列表的更新究竟是如何操作的呢?
没有key对应的源代码如下:
我们会发现上面的diff算法效率并不高:
如果有key,那么会执行什么样的操作呢?
第一步的操作是从头开始进行遍历、比较:
第二步的操作是从尾部开始进行遍历、比较:
第三步是如果旧节点遍历完毕,但是依然有新的节点,那么就新增节点:
第四步是如果新的节点遍历完毕,但是依然有旧的节点,那么就移除旧节点:
第五步是最特色的情况,中间还有很多未知的或者乱序的节点:
所以我们可以发现,Vue在进行diff算法的时候,会尽量利用我们的key来进行优化操作:
文章出自:coderwhy