全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Vue.js学习教程之列表渲染详解

本文主要给大家介绍了关于Vue.js列表渲染的相关资料,分享出来给大家参考学习,下面来看看详细的介绍:

v-for

可以使用 v-for 指令基于一个数组渲染一个列表。这个指令使用特殊的语法,形式为item in items,items 是数据数组,item 是当前数组元素的别名:

示例:

<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' }
 ]
 }
})

在 v-for 块内我们能完全访问父组件作用域内的属性,另有一个特殊变量 $index,正如你猜到的,它是当前数组元素的索引:

<ul id="example-2">
 <li v-for="item in items">
 {{ parentMessage }} - {{ $index }} - {{ item.message }}
 </li>
</ul>
var example2 = new Vue({
 el: '#example-2',
 data: {
 parentMessage: 'Parent',
 items: [
  { message: 'Foo' },
  { message: 'Bar' }
 ]
 }
})

另外,你可以为索引指定一个别名(如果 v-for 用于一个对象,则可以为对象的键指定一个别名):

<div v-for="(index, item) in items">
 {{ index }} {{ item.message }}
</div>

从 1.0.17 开始可以使用 of 分隔符,更接近 JavaScript 遍历器语法:

<div v-for="item of items"></div>

template v-for

类似于 template v-if,也可以将 v-for 用在 <template> 标签上,以渲染一个包含多个元素的块。例如:

<ul>
 <template v-for="item in items">
 <li>{{ item.msg }}</li>
 <li class="divider"></li>
 </template>
</ul>

数组变动检测

变异方法

Vue.js 包装了被观察数组的变异方法,故它们能触发视图更新。

被包装的方法有:

  • push()
  • pop()
  • shift()
  • unshift()
  • splice()
  • sort()
  • reverse()

你可以打开浏览器的控制台,用这些方法修改上例的 items 数组。例如:example1.items.push({ message: 'Baz' })

替换数组

变异方法,如名字所示,修改了原始数组。相比之下,也有非变异方法,如 filter() , concat()slice() ,不会修改原始数组而是返回一个新数组。在使用非变异方法时,可以直接用新数组替换旧数组:

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

可能你觉得这将导致 Vue.js 弃用已有 DOM 并重新渲染整个列表——幸运的是并非如此。 Vue.js 实现了一些启发算法,以最大化复用 DOM 元素,因而用另一个数组替换数组是一个非常高效的操作。

track-by

有时需要用全新对象(例如通过 API 调用创建的对象)替换数组。因为 v-for 默认通过数据对象的特征来决定对已有作用域和 DOM 元素的复用程度,这可能导致重新渲染整个列表。但是,如果每个对象都有一个唯一 ID 的属性,便可以使用 track-by 特性给 Vue.js 一个提示,Vue.js 因而能尽可能地复用已有实例。

例如,假定数据为:

{
 items: [
 { _uid: '88f869d', ... },
 { _uid: '7496c10', ... }
 ]
}

然后可以这样给出提示:

<div v-for="item in items" track-by="_uid">
 <!-- content -->
</div>

然后在替换数组 items 时,如果 Vue.js 遇到一个包含 _uid: '88f869d' 的新对象,它知道它可以复用这个已有对象的作用域与 DOM 元素。

track-by $index

如果没有唯一的键供追踪,可以使用 track-by="$index" ,它强制让 v-for 进入原位更新模式:片断不会被移动,而是简单地以对应索引的新值刷新。这种模式也能处理数据数组中重复的值。

这让数据替换非常高效,但是也会付出一定的代价。因为这时 DOM 节点不再映射数组元素顺序的改变,不能同步临时状态(比如 <input> 元素的值)以及组件的私有状态。因此,如果 v-for 块包含 <input> 元素或子组件,要小心使用 track-by="$index"

问题

因为 JavaScript 的限制,Vue.js 不能检测到下面数组变化:

      1.直接用索引设置元素,如 vm.items[0] = {};

      2.修改数据的长度,如 vm.items.length = 0

为了解决问题 (1),Vue.js 扩展了观察数组,为它添加了一个 $set() 方法:

// 与 `example1.items[0] = ...` 相同,但是能触发视图更新
example1.items.$set(0, { childMsg: 'Changed!'})

至于问题 (2),只需用一个空数组替换 items。

除了 $set() , Vue.js 也为观察数组添加了 $remove() 方法,用于从目标数组中查找并删除元素,在内部它调用 splice() 。因此,不必这样:

var index = this.items.indexOf(item)
if (index !== -1) {
 this.items.splice(index, 1)
}

只用这样:

this.items.$remove(item)

对象 v-for

也可以使用 v-for 遍历对象。除了 $index 之外,作用域内还可以访问另外一个特殊变量 $key。

<ul id="repeat-object" class="demo">
 <li v-for="value in object">
 {{ $key }} : {{ value }}
 </li>
</ul>
new Vue({
 el: '#repeat-object',
 data: {
 object: {
  FirstName: 'John',
  LastName: 'Doe',
  Age: 30
 }
 }
})

也可以给对象的键提供一个别名:

<div v-for="(key, val) in object">
 {{ key }} {{ val }}
</div>

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

值域 v-for

v-for 也可以接收一个整数,此时它将重复模板数次。

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

显示过滤/排序的结果

有时我们想显示过滤/排序过的数组,同时不实际修改或重置原始数据。有两个办法:

     1.创建一个计算属性,返回过滤/排序过的数组;

     2.使用内置的过滤器 filterBy 和 orderBy。

计算属性有更好的控制力,也更灵活,因为它是全功能 JavaScript。但是通常过滤器更方便,详细见 API。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# vue.js  # v  # for列表渲染  # vue  # 列表渲染  # 重新渲染列表  # Vue 列表渲染 key的原理和作用详解  # 你不可不知的Vue.js列表渲染详解  # 详解key在Vue列表渲染时究竟起到了什么作用  # 详解vuejs之v-for列表渲染  # Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)  # 详解Vue的列表渲染  # 已有  # 遍历  # 可以使用  # 复用  # 它是  # 给大家  # 的是  # 组中  # 值域  # 都有  # 也有  # 也会  # 还可以  # 你可以  # 多个  # 也能  # 便可  # 如果没有  # 并非如此  # 另有 


相关文章: 购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  如何获取开源自助建站系统免费下载链接?  如何在IIS服务器上快速部署高效网站?  江苏网站制作公司有哪些,江苏书法考级官方网站?  建站主机与虚拟主机有何区别?如何选择最优方案?  建站之星logo尺寸如何设置最合适?  网站制作网站,深圳做网站哪家比较好?  临沂网站制作企业,临沂第三中学官方网站?  ppt制作免费网站有哪些,ppt模板免费下载网站?  专业公司网站制作公司,用什么语言做企业网站比较好?  香港服务器租用每月最低只需15元?  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  如何快速生成ASP一键建站模板并优化安全性?  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  平台云上自主建站:模板化设计与智能工具打造高效网站  建站为何优先选择香港服务器?  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  如何高效配置IIS服务器搭建网站?  怀化网站制作公司,怀化新生儿上户网上办理流程?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  如何自定义建站之星网站的导航菜单样式?  建站之星安装后如何配置SEO及设计样式?  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  三星网站视频制作教程下载,三星w23网页如何全屏?  股票网站制作软件,网上股票怎么开户?  高端网站建设与定制开发一站式解决方案 中企动力  制作销售网站教学视频,销售网站有哪些?  如何选择最佳自助建站系统?快速指南解析优劣  香港服务器选型指南:免备案配置与高效建站方案解析  小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?  如何快速使用云服务器搭建个人网站?  如何制作网站标识牌,动态网站如何制作(教程)?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?  如何快速生成凡客建站的专业级图册?  如何通过免费商城建站系统源码自定义网站主题与功能?  内网网站制作软件,内网的网站如何发布到外网?  北京网站制作公司哪家好一点,北京租房网站有哪些?  开心动漫网站制作软件下载,十分开心动画为何停播?  长沙做网站要多少钱,长沙国安网络怎么样?  SQL查询语句优化的实用方法总结  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  淘宝制作网站有哪些,淘宝网官网主页?  如何安全更换建站之星模板并保留数据?  建站上市公司网站建设方案与SEO优化服务定制指南  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  实例解析Array和String方法  红河网站制作公司,红河事业单位身份证如何上传? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。