往期内容
《Vue零基础入门教程》第六课:基本选项
《Vue零基础入门教程》第八课:模板语法
《Vue零基础入门教程》第九课:插值语法细节
《Vue零基础入门教程》第十课:属性绑定指令
《Vue零基础入门教程》第十一课:事件绑定指令
《Vue零基础入门教程》第十二课:双向绑定指令
《Vue零基础入门教程》第十三课:条件渲染
1) 什么是列表渲染
列表渲染也称"循环渲染", 通过v-for
遍历数组或者对象
2) 遍历数组
获取元素
如果只希望得到每个数组元素的值, 不需要得到下标
语法
v-for="item in items"
示例
<!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="../node_modules/vue/dist/vue.global.js"></script>
</head>
<body>
<div id="app">
<ul>
<!-- 在指令表达式中, in前面的参数表示数组元素 -->
<!-- <li v-for="item in items">{{item}}</li> -->
<!-- (元素, 下标) in 数组 -->
<li v-for="(value, key) in items">{{key}} -- {{value}}</li>
</ul>
</div>
<script>
const { createApp } = Vue
const vm = createApp({
data() {
return {
items: ['test1', 'test2', 'test3'],
}
},
}).mount('#app')
</script>
</body>
</html>
获取元素和下标
如果只希望得到每个数组元素的值和下标
语法
v-for="(item, index) in items"
3) 遍历对象
- 只取值:
v-for="value in obj"
- 取键和值:
v-for="(value, key) in obj"
- 取键和值和索引:
v-for="(value, key, index) in obj"
4) 绑定key
在遍历时, 通常会给每个渲染的元素绑定一个唯一值key
什么是key
key是Vue内置的属性, 不会渲染到DOM中
语法
<li v-for="item in items" :key="item.id">
key的作用
key是vue给每个元素定义的唯一标识, 来用复用DOM
💡 需求
- 制作一个人员列表, 如下
- 在输入框中依次输入对应的名字
- 当点击按钮时, 在列表的最上方添加一个用户:
小强
示例
<!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="../node_modules/vue/dist/vue.global.js"></script>
</head>
<body>
<div id="app">
<h1>用户列表</h1>
<button @click="addUser">添加一个用户</button>
<ul>
<li v-for="user in users" :key="user.id">
{{user.name}}
<input type="text" />
</li>
</ul>
</div>
<script>
const { createApp } = Vue
const vm = createApp({
data() {
return {
users: [
{ id: 1, name: '小明' },
{ id: 2, name: '小美' },
{ id: 3, name: '小胖' },
],
}
},
methods: {
addUser() {
this.users.unshift({ id: 4, name: '小强' })
},
},
}).mount('#app')
</script>
</body>
</html>
期望的结果
实际的情况
为什么会出现这种现象呢?
原因
vue在渲染每个元素时, 会给元素设置一个自定义属性key
- 根据元素的
key
直接复用之前的DOM, 不会生成新的DOM