## 列表渲染
### 数组渲染
~~~
<ul id="example-1">
<li v-for="item in items">
{{ item.message }}
</li>
</ul>
~~~
~~~
var example1 = new Vue({
el: '#example-1',
data: {
items: [
{ message: 'Foo' },
{ message: 'Bar' }
]
}
})
~~~
![](https://box.kancloud.cn/7505d0dfdb49be328a92d1427634e4b7_218x142.png)
在 v-for 块中,我们拥有对父作用域属性的完全访问权限。v-for 还支持一个可选的第二个参数为当前项的索引。
~~~
<ul id="example-2">
<li v-for="(item, index) in items">
{{ parentMessage }} - {{ index }} - {{ item.message }}
</li>
~~~
~~~
var example2 = new Vue({
el: '#example-2',
data: {
parentMessage: 'Parent',
items: [
{ message: 'Foo' },
{ message: 'Bar' }
]
}
})
~~~
![](https://box.kancloud.cn/8c8a8d1d80a77ffcb48fa7d85dd8cbba_452x168.png)
你也可以用 of 替代 in 作为分隔符,因为它是最接近 JavaScript 迭代器的语法:
~~~
<div v-for="item of items"></div>
~~~
### 对象渲染
~~~
<ul id="v-for-object" class="demo">
<li v-for="value in object">
{{ value }}
</li>
</ul>
~~~
~~~
new Vue({
el: '#v-for-object',
data: {
object: {
firstName: 'John',
lastName: 'Doe',
age: 30
}
}
})
~~~
![](https://box.kancloud.cn/e63df8cb2dbf0892d3f804a362ad656e_248x194.png)
你也可以提供第二个的参数为键名
~~~
<div v-for="(value, key) in object">
{{ key }}: {{ value }}
</div>
~~~
第三个参数为索引:
~~~
<div v-for="(value, key, index) in object">
{{ index }}. {{ key }}: {{ value }}
</div>
~~~
### key
当 Vue.js 用v-for 正在更新已渲染过的元素列表时,它默认用“就地复用”策略。如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序, 而是简单复用此处每个元素,并且确保它在特定索引下显示已被渲染过的每个元素。
这个默认的模式是高效的,但是只适用于不依赖子组件状态或临时 DOM 状态 (例如:表单输入值) 的列表渲染输出
为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一 key 属性。理想的 key 值是每项都有的唯一 id。
~~~
<div v-for="item in items" :key="item.id">
<!-- 内容 -->
</div>
~~~
建议尽可能在使用 v-for 时提供 key,除非遍历输出的 DOM 内容非常简单,或者是刻意依赖默认行为以获取性能上的提升。
因为它是 Vue 识别节点的一个通用机制,key 并不与 v-for 特别关联,key 还具有其他用途。
### 课后习题
1.将如下数据渲染到页面上
~~~
let news = [
{title:'新闻1', time: '2012-12-1', author: 'ADMIN'},
{title:'新闻2', time: '2012-12-2', author: 'JACK'},
{title:'新闻3', time: '2012-12-3', author: 'BOB'},
{title:'新闻4', time: '2012-12-4', author: 'ADMIN'},
{title:'新闻5', time: '2012-12-5', author: 'ADMIN'}
]
~~~
排版效果类似于下面的效果,且隔行文字颜色不一样,奇数行红色,偶数行绿色
* 新闻1 2012-12-1 ADMIN
* 新闻2 2012-12-2 JACK
* 新闻3 2012-12-3 BOB
* 新闻4 2012-12-4 ADMIN
* 新闻5 2012-12-5 ADMIN
- Less
- 课程规划
- Less概述
- 变量
- 混合
- 嵌套
- 继承
- 导入
- 函数
- 其他
- 实战
- ES6
- 课程规划
- ES6概述
- let和const命令
- 变量的解构赋值
- 字符串扩展
- 函数扩展
- 数组扩展
- Set和Map数据结构
- Symbol
- Generator 函数
- Promise对象
- Class语法
- Module 的语法
- ES7和ES8
- 实战
- VUE
- 课程规划
- vue概述
- vue实例
- 模版语法
- 计算属性和侦听器
- Class和Style的绑定
- 条件渲染
- 列表渲染
- 事件处理
- 表单输入绑定
- 组件基础
- 过渡和动画
- 自定义指令
- 过滤器
- 响应式原理
- 实战课程
- Node
- 课程规划
- 课程概述
- node入门实例
- 模块系统
- 回调函数
- 全局对象
- 常用模块介绍
- 常用模块介绍-1
- 常用模块介绍-2
- 常用模块介绍-3
- npm使用
- express的使用
- express的使用-1
- webpack基础
- 实战
- 微信小程序
- 课程规划
- 课程概述
- 基本配置和生命周期
- wxml模版
- wxss
- wxs
- 组件
- 微信API
- 自定义组件开发
- 实战小程序
- Element
- 课程规划
- 课程概述
- 特性介绍
- 组件介绍-基础组件
- 组件介绍-表单组件
- 组件介绍-数据展示组件
- 组件介绍-提示组件
- 组件介绍-导航组件
- 组件介绍-其他组件
- 综合案例