首先我们来看一段代码:
<body>
<div id="app">
<div>
<input type="text" v-model="name">
<button @click="add">添加</button>
</div>
<ul>
<li v-for="item in list">
<input type="checkbox"> {{item.name}}
</li>
</ul>
</div>
</body>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script>
var vm = new Vue({
el: '#app',
data: {
name: '',
newId: 3,
list: [
{ id: 1, name: 'HTML' },
{ id: 2, name: 'CSS' },
{ id: 3, name: 'JavaScript' }
]
},
methods: {
add() {
this.list.unshift({ id: ++this.newId, name: this.name })
this.name = ''
}
}
});
</script>
这里我们没有加key,我们勾选CSS,然后添加一个新的数据
这里我们可以发现,CSS并没有被选中,而是HTML被选中了
我们可以这样理解:key是给每一个vnode的唯一id,也是diff的一种优化策略,可以根据key,更准确, 更快的找到对应的vnode节点,如果没有加key,就容易发生像上面这样的Bug