赞
踩
v-for:列表渲染
v-for将JSON数据中的数组或对象渲染出列表的样式呈现。
直接见代码实例,如下:
<!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 type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<div id="root">
<h2>遍历数组</h2>
<ul>
<li v-for="(p,index) in person">
{{p.id}}--{{p.name}}
</li>
</ul>
<h2>遍历对象</h2>
<ul>
<li v-for="(value,key) in car">
{{key}}--{{value}}
</li>
</ul>
<h2>遍历字符串</h2>
<ul>
<li v-for="(char,index) in str">
{{char}}--{{index}}
</li>
</ul>
<h2>遍历次数</h2>
<ul>
<li v-for="(number,index) in 5">
{{number}}--{{index}}
</li>
</ul>
</div>
<script>
var vm = new Vue({
el: "#root",
data: {
person: [{
id: "001",
name: "张三"
}, {
id: "002",
name: "李四"
}, {
id: "003",
name: "王五"
}],
car: {
name: "马自达",
price: "¥3000000"
},
str: "hello"
}
})
</script>
</body>
</html>
格式:<标签 v-for="..." :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 type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<div id="root">
<button @click="add">点我添加老刘</button>
<ul>
<li v-for="(p,index) in person" :key="index">
{{p.name}}--{{p.age}}
<input type="text">
</li>
</ul>
</div>
<script>
var vm = new Vue({
el: "#root",
data: {
person: [{
id: "001",
name: "张三",
age: 18
}, {
id: "002",
name: "李四",
age: 19
}, {
id: "003",
name: "王五",
age: 20
}]
},
methods: {
add() {
const p = {
id: "004",
name: "老刘",
age: 40
}
this.person.unshift(p)
}
}
})
</script>
</body>
</html>
现在我们在页面上的文本框中添加对应信息,如下:
然后点击按钮,如下:
我们可以观察到老刘的文本框对应的是张三,张三对应的的文本框是李四,李四的文本框对应的是王五,王五空了,这是为什么吗呢,继续看下面!
结合下面图片进行讲解:
上诉代码中key的值是与数组下标绑定的,添加老刘用的是unshift方法(将新的元素添加到数组最前面),所以老刘是第一个元素,key是0,其他依次。没有添加老刘前(图片左边),添加老刘后虚拟DOM改变(图片右边),在添加老刘后key发生变化,Vue内部的对比算法依据key值与原来的虚拟DOM比较(即key相同的进行比较),看下面图片,比较key=0的DOM对象,标签内文本不一样所以用更新后的,input,li标签一样继续沿用以前的,因此这就是上诉情况的原因:Vue的对比算法,对比的是虚拟DOM,而我们文本框填入对应信息是在真是DOM的操作,所以对比算法无法判断input内文本的改变,只知道input没改变,所以继续沿用的未添加前的key=0的li标签内的input。发生上述情况其实就是数组元素下标改变,key值对应发生变化,后面的都是这个原理。
当我们key与数组下标绑定时,要想不发生上诉情况,可以将老刘的添加用push方法(将元素添加到数组的最后),这样在添加后,原来的DOM对象key值没发生变化,按照数组下标。其实最好的方法是将key与上诉唯一标识id绑定,这样就可以忽略数组添加新元素的方法
以上就是v-for和key的讲解。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。