你不可不知的Vue.js列表渲染详解


Posted in Javascript onOctober 01, 2019

介绍

用 v-for 把一个数组对应为页面上的一组元素

vue.js 使用的是 v-for 指令来处理组件元素的循环迭代逻辑。通常它会和 v-if 配合使用,达到我们所需要的处理逻辑。
v-for 的语法形式是 item in items,其中 items 就是我们要循环的数组,而 item 则是被迭代的数组元素的别名。

<ul id="example-1">
 <li v-for="item in items">
 {{ item.message }}
 </li>
</ul>

我们都知道既然有循环那肯定少不了对索引的处理。v-for 指令给我们提供了可选的第二个参数,即当前项的索引。

<ul id="example-2">
 <li v-for="(item, index) in items">
 {{ parentMessage }} - {{ index }} - {{ item.message }}
 </li>
</ul>

index 就是那个当前索引了。

你也可以使用 of 替代 in 作为分隔符。

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

在 v-for 里使用对象

是哒,很明显 v-for 也可以用来遍历一个对象的属性。

<ul id="v-for-object" class="demo">
 <li v-for="value in object">
 {{ value }}
 </li>
</ul>

也可以提供第二个参数为 property 名称 (也就是键名)

<div v-for="(value, name) in object">
 {{ name }}: {{ value }}
</div>

还可以用第三个参数作为索引

<div v-for="(value, name, index) in object">
 {{ index }}. {{ name }}: {{ value }}
</div>

维护状态

敲黑板啦哈~

vuejs 为了维护循环列表的状态需要提供唯一的 key 属性。
这个唯一的 key 可以为我们提供列表元素状态的更新,避免重复渲染等优化页面的性能。

这个 key 很关键,并不推荐使用简单的索引作为 key 的值,因为会有造成重复渲染混乱的可能。

数组更新检测

咳咳~ 继续敲黑板

我们在写程序的时候,往往会有数据更新但是页面元素没有跟着对应变化的情况。

数组列表的更新检测 vue 为我们提供了一套解决方案,但是需要注意它们在使用的方式上是不同的。

变异方法

意思就是以下的数组处理方法可以触发视图上的更新。

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

需要注意的是它们处理的都是原始数组。也就是在原来的数组上增加删除或者排序操作。

非变异方法

数组也有一些方法不会改变原始数据,而是返回新的数组。

filter()
concat()
slice()

返回新的数组在页面更新渲染的性能大家不必担心,vue 已经为我们做好了重用工作。

需要注意,在有些情况 vue 无法检测数组变动的情况如下:

  1. 当你利用索引直接设置一个数组项时,例如:vm.items[indexOfItem] = newValue
  2. 当你修改数组的长度时,例如:vm.items.length = newLength
var vm = new Vue({
 data: {
 items: ['a', 'b', 'c']
 }
})
vm.items[1] = 'x' // 不是响应性的
vm.items.length = 2 // 不是响应性的

为了解决这类问题,官方提供了两种解决方案。

1、Vue.set

// Vue.set
Vue.set(vm.items, indexOfItem, newValue)

2、Array.prototype.splice

// Array.prototype.splice
vm.items.splice(indexOfItem, 1, newValue)

如果我们在处理数据无法更新视图的时候记得试试这个方法。

对象变更检测注意事项

对于对象属性的增加和删除,对于已经创建的实例,Vue 不允许动态添加根级别的响应式属性。

对于这个问题可以使用 Vue.set(object, propertyName, value) 方法向嵌套对象添加响应式属性。

v-for 还可以处理整数的循环

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

最后提醒使用 v-for 时一定要记得带上 key 哟!

神秘的 set

综上我们会知道 js 无法处理组件即时更新的都由 vue 提供的这个 set 方法接管。那么这个 set 有什么过人之处,可以完成组件与数据的绑定呢?

关键位置可以看 vue 源码的这里 github.com/vuejs/vue/b…

set 方法开始会有一些逻辑判断,对于数组的处理依然使用的是 splice 方法。

if (Array.isArray(target) && isValidArrayIndex(key)) {
 target.length = Math.max(target.length, key)
 target.splice(key, 1, val)
 return val
}

其余的就交给我们 vue 不支持的 IE8 ECMAScript5 特性 Object.defineProperty

Object.defineProperty(obj, key, {
 value: val,
 enumerable: !!enumerable,
 writable: true,
 configurable: true
})

下次我会对 Object.defineProperty 在做详细介绍,今天就到这了,晚安?。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
IScroll5 中文API参数说明和调用方法
May 21 Javascript
基于Bootstrap+jQuery.validate实现表单验证
May 30 Javascript
js中 计算两个日期间的工作日的简单实例
Aug 08 Javascript
微信开发 使用picker封装省市区三级联动模板
Oct 28 Javascript
jQuery和JavaScript节点插入元素的方法对比
Nov 18 Javascript
Django中使用jquery的ajax进行数据交互的实例代码
Oct 15 jQuery
Vue递归组件+Vuex开发树形组件Tree--递归组件的简单实现
Apr 01 Javascript
重学JS之显示强制类型转换详解
Jun 30 Javascript
解决vue使用vant下拉框van-dropdown-item 绑定title值不变问题
Aug 05 Javascript
antd form表单数据回显操作
Nov 02 Javascript
全网小程序接口请求封装实例代码
Nov 06 Javascript
JavaScript中条件语句的优化技巧总结
Dec 04 Javascript
基于VUE的v-charts的曲线显示功能
Oct 01 #Javascript
Echarts地图添加引导线效果(labelLine)
Sep 30 #Javascript
javascript实现摄像头拍照预览
Sep 30 #Javascript
java和js实现的洗牌小程序
Sep 30 #Javascript
JS使用H5实现图片预览功能
Sep 30 #Javascript
在vue中使用jsx语法的使用方法
Sep 30 #Javascript
微信小程序自定义tabBar在uni-app的适配详解
Sep 30 #Javascript
You might like
一个很不错的PHP翻页类
2009/06/01 PHP
php 实现进制转换(二进制、八进制、十六进制)互相转换实现代码
2010/10/22 PHP
ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
2014/07/22 PHP
php创建session的方法实例详解
2015/01/27 PHP
原生Js页面滚动延迟加载图片实现原理及过程
2013/06/24 Javascript
基于jquery的文章中所有图片width大小批量设置方法
2013/08/01 Javascript
多种方法实现JS动态添加事件
2013/11/01 Javascript
jQuery获取DOM节点实例分析(2种方式)
2015/12/15 Javascript
javascript函数中的3个高级技巧
2016/09/22 Javascript
详解ElementUI之表单验证、数据绑定、路由跳转
2017/06/21 Javascript
Node.JS使用Sequelize操作MySQL的示例代码
2017/10/09 Javascript
vue生成文件本地打开查看效果的实例
2018/09/06 Javascript
javascript实现简单搜索功能
2020/03/26 Javascript
vue 使用 sortable 实现 el-table 拖拽排序功能
2020/12/26 Vue.js
[00:16]热血竞技场
2019/03/06 DOTA
Python实现在线暴力破解邮箱账号密码功能示例【测试可用】
2017/09/06 Python
python实现发送邮件功能代码
2017/12/14 Python
Python中循环后使用list.append()数据被覆盖问题的解决
2018/07/01 Python
Python最小二乘法矩阵
2019/01/02 Python
Django之PopUp的具体实现方法
2019/08/31 Python
PIL包中Image模块的convert()函数的具体使用
2020/02/26 Python
一文了解python 3 字符串格式化 F-string 用法
2020/03/04 Python
Python Scrapy图片爬取原理及代码实例
2020/06/12 Python
详解PyQt5中textBrowser显示print语句输出的简单方法
2020/08/07 Python
用 Django 开发一个 Python Web API的方法步骤
2020/12/03 Python
学会迭代器设计模式,帮你大幅提升python性能
2021/01/03 Python
利用CSS3的定位页面元素
2009/08/29 HTML / CSS
俄罗斯购买自行车网站:Vamvelosiped
2021/01/29 全球购物
JSF面试题:Jsf中导航的标签是什么
2013/04/20 面试题
如何利用XMLHTTP检测URL及探测服务器信息
2013/11/10 面试题
中专自我鉴定
2014/02/05 职场文书
法学院毕业生求职信
2014/06/25 职场文书
汽车服务工程专业自荐信
2014/09/02 职场文书
大三学生学年自我鉴定
2014/09/12 职场文书
学生会感恩节活动方案
2014/10/11 职场文书
春季运动会开幕词
2015/01/28 职场文书