当我点击按钮时会在中间插入一个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