在Vue开发中,列表数据绑定非常简单易用,本文主要通过一些简单的小例子,讲述v-for的使用方法,仅供学习分享使用,如有不足之处,还请指正。

用 v-for 把一个数组对应为一组元素

我们可以用 v-for 指令基于一个数组来渲染一个列表。 v-for 指令需要使用 item in items 形式的特殊语法,其中 items 是源数据数组,而 item 则是被迭代的数组元素的别名。如下所示:

 <ul>
<li v-for="fruit in fruits">
{{ fruit.name }}
</li>
</ul>

在 v-for 块中,我们可以访问所有父作用域的属性。v-for 还支持一个可选的第二个参数,即当前项的索引。如下所示:

 <ul>
<li v-for="(fruit, index) in fruits">
{{ msg }} - {{ index }} - {{ fruit.name }}
</li>
</ul>

你也可以用 of 替代 in 作为分隔符,因为它更接近 JavaScript 迭代器的语法,如下所示:

 <ul id="example-3">
<li v-for="fruit of fruits">
{{ fruit.name }}
</li>
</ul>

其中fruits是js中定义的一个数组,如下所示:

 <script type="text/javascript">
var app = new Vue({
el: '#app',
data: {
msg: 'hello world!!!',
fruits: [
{id:0, name: 'Apple' },
{id:1, name: 'Pear' },
{id:2, name: 'Orange'},
{id:3, name:'Banana'}
]
}
});
</script>

在 v-for 里使用对象

v-for 除了可以遍历数组,也可以用 v-for 来遍历一个对象的属性,如下所示:

 <ul>
<li v-for="v in book">
{{ v }}
</li>
</ul>

也可以提供第二个的参数为 property 名称 (也就是键名):如下所示:v,n分别表示:值和名称

 <ul>
<li v-for="(v,n) in book">
{{n}}--{{ v }}
</li>
</ul>

还可以用第三个参数作为索引:,i表示当前索引,如下所示:

 <ul>
<li v-for="(v,n,i) in book">
{{n}}--{{ v }}---{{i}}
</li>
</ul>

综上所述:

  1. 对于数组,第一个参数是内容,第二个参数是索引;
  2. 对于对象,第一个参数是值,第二个参数是名称,第三个参数是索引。

注意:在遍历对象时,会按 Object.keys() 的结果遍历,但是不能保证它的结果在不同的 JavaScript 引擎下都一致。

其中book是一个对象,如下所示:

 <script type="text/javascript">
var app = new Vue({
el: '#app',
data: {
msg: 'hello world!!!',
book: {
title: 'How to do lists in Vue',
author: 'Jane Doe',
publishedAt: '2016-04-10'
}
});
</script>

维护状态

当 Vue 正在更新使用 v-for 渲染的元素列表时,它默认使用“就地更新”的策略。如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序,而是就地更新每个元素,并且确保它们在每个索引位置正确渲染。这个默认的模式是高效的,但是只适用于不依赖子组件状态或临时 DOM 状态 (例如:表单输入值) 的列表渲染输出。为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一 key 属性,如下所示:

 <div v-for="(f,i) in fruits" v-bind:key="f.id">
<!-- 内容 -->
{{f.name}}-----{{i}}
</div>

建议尽可能在使用 v-for 时提供 key attribute,除非遍历输出的 DOM 内容非常简单,或者是刻意依赖默认行为以获取性能上的提升。因为它是 Vue 识别节点的一个通用机制,key 并不仅与 v-for 特别关联。不要使用对象或数组之类的非基本类型值作为 v-for 的 key,请用字符串或数值类型的值。

数组更新检测

Vue 将被侦听的数组的变异方法进行了包裹,所以它们也将会触发视图更新。这些被包裹过的方法包括:
push()、pop()、shift()、unshift()、splice()、sort()、reverse()

你可以打开控制台,然后对前面例子的 items 数组尝试调用变异方法。如下所示:

替换数组

变异方法,顾名思义,会改变调用了这些方法的原始数组。相比之下,也有非变异 (non-mutating method) 方法,例如 filter()、concat() 和 slice() 。它们不会改变原始数组,而总是返回一个新数组。当使用非变异方法时,可以用新数组替换旧数组:

 app.items = app.items.filter(function (item) {
return item.message.match(/Foo/)
})

你可能认为这将导致 Vue 丢弃现有 DOM 并重新渲染整个列表。幸运的是,事实并非如此。Vue 为了使得 DOM 元素得到最大范围的重用而实现了一些智能的启发式方法,所以用一个含有相同元素的数组去替换原来的数组是非常高效的操作。

注意:由于 JavaScript 的限制,Vue 不能检测以下数组的变动:

1.当你利用索引直接设置一个数组项时,例如:vm.items[indexOfItem] = newValue
2.当你修改数组的长度时,例如:vm.items.length = newLength

对象变更检测注意事项

由于 JavaScript 的限制,Vue 不能检测对象属性的添加或删除,如下所示:

 vm.items[1] = 'x' // 不是响应性的
vm.items.length = 2 // 不是响应性的

为了解决第一类问题,以下两种方式都可以实现:

 // Vue.set
Vue.set(vm.items, indexOfItem, newValue)
// Array.prototype.splice
vm.items.splice(indexOfItem, 1, newValue)
//你也可以使用 vm.$set 实例方法,该方法是全局方法 Vue.set 的一个别名:
vm.$set(vm.items, indexOfItem, newValue)
 // `vm.a` 现在是响应式的
vm.b = 2
// `vm.b` 不是响应式的
//对于已经创建的实例,Vue 不允许动态添加根级别的响应式属性。
//但是,可以使用 Vue.set(object, propertyName, value) 方法向嵌套对象添加响应式属性。例如,对于:
//你可以添加一个新的 age 属性到嵌套的 userProfile 对象:
//Vue.set(vm.userProfile, 'age', 27)
//你还可以使用 vm.$set 实例方法,它只是全局 Vue.set 的别名:
//vm.$set(vm.userProfile, 'age', 27)
//有时你可能需要为已有对象赋值多个新属性,比如使用 Object.assign() 或 _.extend()。
//在这种情况下,你应该用两个对象的属性创建一个新的对象。所以,如果你想添加新的响应式属性,不要像这样:
Object.assign(vm.userProfile, {
age: 27,
favoriteColor: 'Vue Green'
});
//你应该这样做:
vm.userProfile = Object.assign({}, vm.userProfile, {
age: 27,
favoriteColor: 'Vue Green'
});

为了解决第二类问题,你可以使用 splice:

 vm.items.splice(newLength)

显示过滤/排序后的结果

有时,我们想要显示一个数组经过过滤或排序后的版本,而不实际改变或重置原始数据。在这种情况下,可以创建一个计算属性,来返回过滤或排序后的数组。

 <ul>
<li v-for="n in evenNumbers">{{ n }}</li>
</ul>

在计算属性不适用的情况下 (例如,在嵌套 v-for 循环中) 你可以使用一个方法:

  <ul>
<li v-for="n in even(numbers)">{{ n }}</li>
</ul>

其中,evenNumbers为计算属性,even为一个函数,如下所示:

 <script type="text/javascript">
var app = new Vue({
el: '#app',
data: {
msg: 'hello world!!!',
numbers: [ 1, 2, 3, 4, 5 ],
},
methods: {
even: function (numbers) {
return numbers.filter(function (number) {
return number % 2 === 0;
})
}
},
computed: {
evenNumbers: function () {
return this.numbers.filter(function (number) {
return number % 2 === 0;
})
}
}
});
</script>

在 v-for 里使用值范围

v-for 也可以接受整数。在这种情况下,它会把模板重复对应次数。

 <div>
<span v-for="n in 10">{{ n }} </span>
</div>

在 <template> 上使用 v-for

类似于 v-if,你也可以利用带有 v-for 的 <template> 来循环渲染一段包含多个元素的内容。比如:

 <ul>
<template v-for="f in fruits">
<li>{{ f.name }}</li>
<li class="divider" role="presentation"></li>
</template>
</ul>

备注

丑奴儿·书博山道中壁

辛弃疾

少年不识愁滋味,爱上层楼。爱上层楼,为赋新词强说愁。

而今识尽愁滋味,欲说还休。欲说还休,却道天凉好个秋。

一起学Vue之列表渲染的更多相关文章

  1. vue基础——列表渲染

    列表渲染 用 v-for 把一个数组对应为一组元素 我们用 v-for 指令根据一组数组的选项列表进行渲染.v-for 指令需要使用 item in items 形式的特殊语法, items 是源数据 ...

  2. 【03】Vue 之列表渲染及条件渲染

    3.1. 条件渲染 有时候我们要根据数据的情况,决定标签是否进行显示或者有其他动作.最常见的就是,表格渲染的时候,如果表格没有数据,就显示无数据.如果有数据就显示表格数据. Vue帮我们提供了一个v- ...

  3. vue基础---列表渲染

    首先简单回顾下v-for‘指令 <ol id="list_area"> <li v-for="book in books">{{book ...

  4. 前端框架之Vue(6)-列表渲染

    用v-for把一个数组对应为一组元素 我们用 v-for 指令根据一组数组的选项列表进行渲染. v-for 指令需要使用 item in items 形式的特殊语法, items 是源数据数组并且 i ...

  5. vue之列表渲染

    一.v-for循环用于数组 v-for 指令根据一组数组的选项列表进行渲染. 1.v-for 指令需要使用 item in items 形式的特殊语法,items 是源数据数组名, item 是数组元 ...

  6. vue笔记-列表渲染

    用v-for把一个数组对应为一组元素 使用方法:v-for="(item,index) in items"//也可以使用of替代in { items:源数组 item:数组元素迭代 ...

  7. 关于vue.js中列表渲染练习

    html: <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8 ...

  8. 03-Vue入门系列之Vue列表渲染及条件渲染实战

    3.1. 条件渲染 有时候我们要根据数据的情况,决定标签是否进行显示或者有其他动作.最常见的就是,表格渲染的时候,如果表格没有数据,就显示无数据.如果有数据就显示表格数据. Vue帮我们提供了一个v- ...

  9. 3-7 Vue中的列表渲染

     举个案例:循环data中的list的值在div中,并显示相应的index值. 关于数组的循环: //显示效果如下图: //一般的列表渲染最好带一个key值,要把key值设置为唯一值的话,可以选择in ...

随机推荐

  1. 简易音乐播放器主界面设计 - .NET CORE(C#) WPF开发

    微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. 简易音乐播放器主界面设计 - .NET CORE(C#) WPF开发 阅读导航 本文背景 代码 ...

  2. mysql版本报错

    IntelliJIdea2019.3打开原项目报mysql版本报错: Error opening zip file or JAR manifest missing : /C:/Users/flycat ...

  3. Mybaits(10)N+1问题

    N+1问题 从上面的例子日志中我们可以看到所有级联都成功了,但是引发了性能问题,例如我们在查询雇员的信息和工作任务信息,此时体检表和工牌信息就是多余,我们没必要查询一次.如果想日志体现的那样,取出了所 ...

  4. 论文阅读笔记(十五)【CVPR2016】:Top-push Video-based Person Re-identification

    Approach 特征由两部分组成:space-time特征和外貌特征.space-time特征由HOG3D[传送门]提取,其包含了空间梯度和时间动态信息:外貌特征采用颜色直方图[传送门]和LBP[传 ...

  5. 0013 基于DRF框架开发(01 基类视图 APIView)

    之前学习了模型序列化和普通序列化,我们用最简单的视图和url实现了对序列化的操作. 而实际上,象之前那种由DRF自动生成所有的视图和url的情况,在应用是使用很少.而需要用户根据实际业务需求,自定义视 ...

  6. Supermarket POJ - 1456 贪心+并查集

    #include<iostream> #include<algorithm> using namespace std; const int N=1e5; struct edge ...

  7. PTA 简单计算器(C语言)

    模拟简单运算器的工作.假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算. 输入格式:输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数.遇 ...

  8. MySql 小表驱动大表

    在了解之前要先了解对应语法 in 与 exist. IN: select * from A where A.id in (select B.id from B) in后的括号的表达式结果要求之输出一列 ...

  9. C# LINQ学习笔记三:LINQ to OBJECT之操作字符串

    本笔记摘抄自:https://www.cnblogs.com/liqingwen/p/5814204.html,记录一下学习过程以备后续查用. 一.统计单词在字符串中出现的次数 请注意,若要执行计数, ...

  10. Sql Server2008忘记sa登陆密码

    Sql的sa登陆密码忘记解决方法: 语句执行的前提: 1.系统可以登陆进去(当不记得sa密码的时候,可以使用windows用户验证的方式进行登陆) 2.平时用sa登陆,点了记住密码但是不记得密码是多少 ...