vue-learning:5-template-v-for
5 列表渲染的指令v-for
v-for
on Array / Object / String / Numberv-for
on templatev-for
on expressionv-for
with key
v-for
指令可以对一个可迭代对象进行遍历,将指定的值循环输出显示。
基本语法形式:
v-for = "item in arr" OR v-for = "(item, index) in arr"
v-for = "value in obj" OR v-for = "(value, key, index) in obj"
v-for = "char in str" OR v-for = "(char, index) in str"
v-for = "n in num"
v-for = "item in expression" expression === Array / Object / str / num
以上 index, key都是可省略,并注意参数的顺序:值在前,序号或键值在后。
in
改为 of
同样有效,如 v-for = "item of arr"
点击查看DEMO: v-for on Array/Object/String/Number/template
//js
new Vue({
el: "#app",
data: {
arr: ["HTML", "CSS", "JS", "JQ", "VUE"],
obj: {
Rocket: "McGrady",
Lakers: "Kobe",
Mavericks: "Nowitzki",
},
str: "abc",
num: 3
}
})
<!-- Array -->
<li v-for = "item in arr">{{ item }}</li>
<li v-for = "(item, index) in arr">{{ index + "-" + item }}</li>
<li v-for = "(item, index) of arr">{{ index + "-" + item }}</li>
<!-- Object -->
<li v-for = "value in obj">{{ value }}</li>
<li v-for = "(value, key) in obj">{{ key + "-" + value }}</li>
<li v-for = "(value, key, index) in obj">{{index + "-" + key + "-" + value }}</li>
<!-- String -->
<li v-for = "char in str">{{ char }}</li>
<li v-for = "(char, index) in str">{{ index + "-" + char }}</li>
<!-- Number -->
<li v-for = "n in num">{{ n }}</li>
<!-- v-for on template -->
<h3>super star in NBA team</h3>
<template v-for = "(starName, teamName) in obj">
<p>team name: {{ teamName }}</P>
<p>super star: {{ starName }}</p>
</template>
使用`template`包裹元素块可以让文档避免太多无意义块元素,如太多只作包裹性质的`div`
<!-- v-for on expression -->
<ul id="app">
<!-- v-for 渲染计算属性的值,偶数列表 -->
<li v-for="even in evenNumbers">{{ even }}</li>
<br/>
<!-- v-for 渲染方法oddNumber执行返回的奇数列表 -->
<li v-for="odd in oddNumbers(numbers)">{{ odd }}</li>
</ul>
new Vue({
el: "#app",
data: {
numbers: [1,2,3,4,5,6,7,8,9]
},
computed: {
evenNumbers() { return this.numbers.filter(item => item % 2 === 0)}
},
methods: {
oddNumbers(arr) { return arr.filter(item => item % 2 !== 0)}
}
})
key 标识列表元素的唯一性
同上一节中讲到的v-if
中的key
作用一样,如果在v-for
的数据发生了变化,vue并不是重新生成并渲染所有元素,而是智能找到需要更改的元素,并只更新这些元素,其它元素“就地复用”。这是VUE的差异对比机制控制的(virtual DOM和DOM diff会在下一阶段总结)。
刻意采用这种默认机制可以获取页面渲染性能的提升,但官方仍然建议不要使用默认做法,正确做法是加上key
,以便对每个列表元素提供一个可跟踪的唯一属性值,在大型项目中或组件列表渲染中更为高效。
`key`应该是一个字符串或数值类型的唯一值。不要使用对象或数组之类的`非原始类型值`,如不要用下标`index`作为 v-for 的 key。
<!-- has key -->
<div id="app">
<template>
<demo-key
v-for="(item, i) of items"
@click.native="items.splice(i,1)">
{{ item }}
</demo-key>
</template>
</div>
<!-- no key -->
<div id="app">
<template>
<demo-key
v-for="(item, i) of items"
:key="item"
@click.native="items.splice(i,1)">
{{ item }}
</demo-key>
</template>
</div>
// js
const randomColor = () => `hsl(${Math.floor(Math.random() * 360)},75%, 85%)`
const DemoKey = {
template: `<p :style="{backgroundColor: color}"><slot></slot></p>`,
data: () => ({
color: randomColor()
})
}
new Vue({
el: "#app",
data: {
items: ["one", "two", "three", "four", "five"]
},
components: {
DemoKey
}
})
vue-learning:5-template-v-for的更多相关文章
- vue报错:Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.
在.vue文件中引入了 element-ui 的 table 和 pagination 组件后,报错:Component template should contain exactly one roo ...
- 小白学习VUE第二课:环境搭建 VUE Node.js VSCode template模板
环境搭建 VUE Node.js VSCode template模板: 首先安装node:http://www.runoob.com/nodejs/nodejs-install-setup.html ...
- Vue系列:如何将百度地图包装成Vue的组件
主要分解为如下步骤: (1)在html文件中引入百度地图, <script type="text/javascript" src="http://api.map.b ...
- Vue.js:轻量高效的前端组件化方案
转发一篇尤老师对vue.js的介绍,了解vue.js的来龙去脉.不过现在已经是2.0了,也有添加一些新的东西,当然有些东西也改了. Vue.js:轻量高效的前端组件化方案 Vue.js 是我在2014 ...
- Deep learning:四十六(DropConnect简单理解)
和maxout(maxout简单理解)一样,DropConnect也是在ICML2013上发表的,同样也是为了提高Deep Network的泛化能力的,两者都号称是对Dropout(Dropout简单 ...
- Vue.js:轻量高效的前端组件化方案(转载)
摘要:Vue.js通过简洁的API提供高效的数据绑定和灵活的组件系统.在前端纷繁复杂的生态中,Vue.js有幸受到一定程度的关注,目前在GitHub上已经有5000+的star.本文将从各方面对Vue ...
- 转载 Deep learning:六(regularized logistic回归练习)
前言: 在上一讲Deep learning:五(regularized线性回归练习)中已经介绍了regularization项在线性回归问题中的应用,这节主要是练习regularization项在lo ...
- 组件嵌套时报:Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.
在组件嵌套的过程中,报了一个错误: 这里报错的原因是:vue的组件(模板)只能有一个根节点,即.vue文件中的<template>标签下只能有一个子元素. 因此,建议大家在写.vue组件的 ...
- 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十二║Vue实战:个人博客第一版(axios+router)
前言 今天正式开始写代码了,之前铺垫了很多了,包括 6 篇基础文章,一篇正式环境搭建,就是为了今天做准备,想温习的小伙伴可以再看看<Vue 基础入门+详细的环境搭建>,内容很多,这里就暂时 ...
- 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十三║Vue实战:Vuex 其实很简单
前言 哈喽大家周五好,马上又是一个周末了,下周就是中秋了,下下周就是国庆啦,这里先祝福大家一个比一个假日嗨皮啦~~转眼我们的专题已经写了第 23 篇了,好几次都坚持不下去想要中断,不过每当看到群里的交 ...
随机推荐
- 2019-7-22-WPF-如何判断两个-LinearGradientBrush-相等
title author date CreateTime categories WPF 如何判断两个 LinearGradientBrush 相等 lindexi 2019-07-22 21:26:2 ...
- pl/sql基础知识—过程快速入门
n 过程 过程用于执行特定的操作,当建立过程时,既可以指定输入参数(in),也可以指定输出参数(out),通过在过程中使用输入参数,可以将数据传递到执行部分:通过使用输出参数可以将执行部分的数据传递 ...
- 3DSMAX安装失败怎样卸载重新安装3DSMAX,解决3DSMAX安装失败的方法总结
技术帖:3DSMAX没有按照正确方式卸载,导致3DSMAX安装失败.楼主也查过网上关于如何解决3DSMAX安装失败的一些文章,是说删除几个3DSMAX文件和3DSMAX软件注册表就可以解决3DSMAX ...
- UVa 623 大整数乘法
UVa 623 计算N! n上限为1000自然不能直接算.所以可以开一个数组f[],f[]每一位存N!结果的6位.如果按进制来理解,就是10^6进制: 例如 11!=39916800=11*10!=1 ...
- Android横竖屏切换和灭屏亮屏时Activity的生命周期探究(1)
研究这个问题的初衷在于项目中碰到了一个问题:横屏的时候灭屏再亮屏,亮屏的时候用户能够清晰的看到先启动竖屏(过程1)再切换到横屏的过程,因为灭屏的时候onSaveInstanceState()保存的时横 ...
- SDUT-3335_数据结构实验之栈与队列八:栈的基本操作
数据结构实验之栈与队列八:栈的基本操作 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 堆栈是一种基本的数据结构.堆栈具 ...
- python 处理图像出现The lower bounary is neither an array of the same size and same type as src, nor a scalar in function inRange
在用python处理图像过程中出现如下错误 导致这个错误的原因是im是二维,而lower_green和upper_green是三维,所以无法用inRange处理. 由上图可以看出image本来是具有高 ...
- 1878: [SDOI2009]HH的项 莫队算法-离线查询区间内部不同数字的个数
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> ...
- WebStorm使用参考手册
WebStorm 是 JetBrains 推出的一款商业的 JavaScript 开发工具 任何一个编辑器都需要保存(ctrl + s),这是所有win平台上编辑类软件的特点,但是webstorm编辑 ...
- 2006年NOIP普及组复赛题解
题目涉及算法: 明明的随机数:简单模拟: 开心的金明:01背包: Jam的计数法:模拟: 数列:二进制. 明明的随机数 题目链接:https://www.luogu.org/problem/P1059 ...