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


Posted in Javascript onMay 17, 2017

本文主要给大家介绍了关于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。

总结

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

Javascript 相关文章推荐
Node.js中使用Buffer编码、解码二进制数据详解
Aug 16 Javascript
JS简单限制textarea内输入字符数量的方法
Oct 14 Javascript
利用jQuery来动态为属性添加或者删除属性的简单方法
Dec 02 Javascript
JQuery实现文字无缝滚动效果示例代码(Marquee插件)
Mar 07 Javascript
H5上传本地图片并预览功能
May 08 Javascript
使用Vue实现图片上传的三种方式
Jul 17 Javascript
微信小程序实现手势滑动卡片效果
Aug 26 Javascript
在Layui 的表格模板中,实现layer父页面和子页面传值交互的方法
Sep 10 Javascript
layui表格内放置图片,并点击放大的实例
Sep 10 Javascript
ES6实现图片切换特效代码
Jan 14 Javascript
vue实现虚拟列表功能的代码
Jul 28 Javascript
JS操作JSON常用方法(10w阅读)
Dec 06 Javascript
JavaScript运动框架 解决速度正负取整问题(一)
May 17 #Javascript
深入理解Commonjs规范及Node模块实现
May 17 #Javascript
JavaScript限制在客户区可见范围的拖拽(解决scrollLeft和scrollTop的问题)(2)
May 17 #Javascript
vue学习笔记之vue1.0和vue2.0的区别介绍
May 17 #Javascript
Angular.JS中的this指向详解
May 17 #Javascript
websocket+node.js实现实时聊天系统问题咨询
May 17 #Javascript
JavaScript简单拖拽效果(1)
May 17 #Javascript
You might like
xml在joomla表单中的应用详解分享
2012/07/19 PHP
php上传图片之时间戳命名(保存路径)
2014/08/15 PHP
vmware linux系统安装最新的php7图解
2019/04/14 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
2019/10/03 PHP
laravel通过a标签从视图向控制器实现传值
2019/10/15 PHP
JavaScript中的Screen屏幕对象
2008/01/16 Javascript
JavaScript入门教程 Cookies
2009/01/31 Javascript
js window.onload 加载多个函数的方法
2009/11/02 Javascript
javascript 处理事件绑定的一些兼容写法
2009/12/24 Javascript
广泛收集的jQuery拖放插件集合
2012/04/09 Javascript
你必须知道的Javascript知识点之&quot;字面量和对应类型&quot;说明介绍
2013/04/23 Javascript
Jquery 模拟用户点击超链接或者按钮的方法
2013/10/25 Javascript
jQuery拖动布局其结果保存到数据库
2015/10/09 Javascript
jquery拖拽排序简单实现方法(效果增强版)
2016/02/16 Javascript
VUE前端cookie简单操作
2017/10/17 Javascript
初探js和简单隐藏效果的实例
2017/11/23 Javascript
利用Javascript实现一套自定义事件机制
2017/12/14 Javascript
对vux点击事件的优化详解
2018/08/28 Javascript
js最实用string(字符串)类型的使用及截取与拼接详解
2019/04/26 Javascript
js中的面向对象之对象常见创建方法详解
2019/12/16 Javascript
原生JS实现汇率转换功能代码实例
2020/05/13 Javascript
javascript实现数字时钟效果
2021/02/06 Javascript
Python自动化测试工具Splinter简介和使用实例
2014/05/13 Python
python实现根据用户输入从电影网站获取影片信息的方法
2015/04/07 Python
python将字符串以utf-8格式保存在txt文件中的方法
2018/10/30 Python
详解pycharm连接不上mysql数据库的解决办法
2020/01/10 Python
django实现日志按日期分割
2020/05/21 Python
原装进口全世界:天猫国际
2016/08/03 全球购物
澳大利亚女性快速时尚零售商:Ally Fashion
2018/04/25 全球购物
Lookfantastic香港官网:英国知名美妆购物网站
2018/06/19 全球购物
阿尔卡特(中国)的面试题目
2014/08/20 面试题
汽车电子与维修专业大学生求职信
2013/09/28 职场文书
《蓝色的树叶》教学反思
2014/02/24 职场文书
党员批评与自我批评(5篇)
2014/09/23 职场文书
优质护理服务心得体会
2016/01/22 职场文书
写给汽车4S店的创业计划书,拿来即用!
2019/08/09 职场文书