你不可不知的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 相关文章推荐
JQuery 插件模板 制作jquery插件的朋友可以参考下
Mar 17 Javascript
用js模拟JQuery的show与hide动画函数代码
Sep 20 Javascript
热点新闻滚动特效的js代码
Aug 17 Javascript
JS常用正则表达式总结
Nov 12 Javascript
jQuery拖拽div实现思路
Feb 19 Javascript
JS实现霓虹灯文字效果的方法
Aug 06 Javascript
javascript实现添加附件功能的方法
Nov 18 Javascript
JavaScript简单实现弹出拖拽窗口(一)
Jun 17 Javascript
canvas绘制一个常用的emoji表情
Mar 30 Javascript
node.js读取Excel数据(下载图片)的方法示例
Aug 02 Javascript
Vue开发环境跨域访问问题
Jan 22 Javascript
解决iView Table组件宽度只变大不变小的问题
Nov 13 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中文本数据翻页(留言本翻页)
2006/10/09 PHP
php 静态页面中显示动态内容
2009/08/14 PHP
解析mysql中UNIX_TIMESTAMP()函数与php中time()函数的区别
2013/06/24 PHP
php简单计算页面加载时间的方法
2015/06/19 PHP
php获取数据库中数据的实现方法
2017/06/01 PHP
对php 判断http还是https,以及获得当前url的方法详解
2019/01/15 PHP
Laravel使用Queue队列的技巧汇总
2019/09/02 PHP
php实现简易计算器
2020/08/28 PHP
jquery实现效果比较好的table选中行颜色
2014/03/25 Javascript
Javascript highcharts 饼图显示数量和百分比实例代码
2016/12/06 Javascript
解析JavaScript模仿块级作用域
2016/12/29 Javascript
react-navigation 如何判断用户是否登录跳转到登录页的方法
2017/12/01 Javascript
fullpage.js最后一屏滚动方式
2018/02/06 Javascript
jQuery实现参数自定义的文字跑马灯效果
2018/08/15 jQuery
Vue源码解析之数组变异的实现
2018/12/04 Javascript
解决Vue 移动端点击出现300毫秒延迟的问题
2020/07/21 Javascript
JQuery基于FormData异步提交数据文件
2020/09/01 jQuery
如何搭建一个完整的Vue3.0+ts的项目步骤
2020/10/18 Javascript
Python之eval()函数危险性浅析
2014/07/03 Python
在Python下使用Txt2Html实现网页过滤代理的教程
2015/04/11 Python
python cx_Oracle模块的安装和使用详细介绍
2017/02/13 Python
python hook监听事件详解
2018/10/25 Python
详解Python连接MySQL数据库的多种方式
2019/04/16 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
2019/06/17 Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
2019/06/24 Python
python 实现矩阵按对角线打印
2019/11/29 Python
Python创建自己的加密货币的示例
2021/03/01 Python
HTML5实现晶莹剔透的雨滴特效
2014/05/14 HTML / CSS
香港太阳眼镜网上商店:SmartBuyGlasses香港
2016/07/22 全球购物
资深生产主管自我评价
2013/09/22 职场文书
财务人员个人自荐信范文
2013/09/26 职场文书
《秋天的雨》教学反思
2016/02/19 职场文书
浅谈如何写好演讲稿?
2019/06/12 职场文书
Python天气语音播报小助手
2021/09/25 Python
Nginx的基本概念和原理
2022/03/21 Servers
win10频率超出范围怎么办?win10老显示超出工作频率范围的解决方法
2022/07/07 数码科技