1. 什么是key?
当我们对一个数据进行遍历生成DOM时,vue的内部会根据索引号对其进行key的定义,而key会作为每一个新生成DOM的唯一标识。
2.为什么不建议索引值作为key?
很多人喜欢直接使用索引值作为key,当所遍历的数据不会发生变化的时候使用索引值作为key也确实不会出现什么问题,但是如果对数据头部进行插入操作的话,则会出现数据不能互相对应的问题;
a. 代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../js/vue.js"></script>
</head>
<body>
<div id="root">
<form @submit.prevent="AddData" v-if="isuse">
id: <input type="text" v-model="person.id">
name: <input type="text" v-model="person.name">
age: <input type="text" v-model="person.age">
<input type="submit" value="新增"></button>
</form>
<h2>人员列表</h2>
<ul>
<li v-for="(person,index) in persons">{{person.name}}-{{person.age}}<input type="text"></li>
</ul>
</div>
<script>
new Vue({
el: '#root',
data: {
persons: [
{ id: '001', name: '张三', age: 18 },
{ id: '002', name: '李四', age: 19 },
{ id: '003', name: '王五', age: 20 },
],
person:{
id: '',
name: '',
age: null
},
isuse:true
},
methods: {
AddData() {
this.persons.unshift(this.person)
this.isuse = false
}
}
})
</script>
</body>
</html>
b. 效果图:
c. 在文本框输入文字,如下:
d. 再新增一个人员,会出现下图这种情况:
e. 很明显对应的输入框已经出现了错乱。
出现这种情况的原因很简单,就是索引值的问题,因为我们在进行插入数据时使用的是unshift() ,即在数组头部插入数据;
而persons数组中原有的数据的索引值都后置了一位,而DOM中的输入框还是绑定着原来的key,也就是说输入框认定的位置是相对应的key而不是li,所以会出现元素对应错乱的问题。
3.应该取用什么作为key值?
在设计数据对象的时候应该设有一个唯一标识作为key,比如编号、手机号、身份证之类不会出现重复的数据,如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../js/vue.js"></script>
</head>
<body>
<div id="root">
<form @submit.prevent="AddData" v-if="isuse">
id: <input type="text" v-model="person.id">
name: <input type="text" v-model="person.name">
age: <input type="text" v-model="person.age">
<input type="submit" value="新增"></button>
</form>
<h2>人员列表</h2>
<ul>
<li v-for="(person,index) in persons" :key="person.id">{{person.name}}-{{person.age}}<input type="text"></li>
</ul>
</div>
<script>
new Vue({
el: '#root',
data: {
persons: [
{ id: '001', name: '张三', age: 18 },
{ id: '002', name: '李四', age: 19 },
{ id: '003', name: '王五', age: 20 },
],
person:{
id: '',
name: '',
age: null
},
isuse:true
},
methods: {
AddData() {
this.persons.unshift(this.person)
this.isuse = false
}
}
})
</script>
</body>
</html>