Vue.js-列表渲染 原
我们用v-for指令根据一组数组的选项列表进行渲染,v-for指令需要以item in items形式的特殊语法,items是源数据数组并且item是数组元素迭代的别名 基本用法
<body class="">
<div id="app-7">
<ul>
<li v-for="item in items">{{item.message}}</li>
</ul>
</div>
<script src="js/vue.js"></script>
<script>
var app = new Vue({
el: "#app-7",
data: {
items: [
{ message: "foo" },
{ message: "bar" }
]
}
})
</script>
</body>
在v-for块中,我们拥有对父作用域属性的完全访问权限,v-for还支持一个可选的第二个参数作为当前项的索引
<body class="">
<div id="app-7">
<ul>
<li v-for="(item,index) in items">{{parentMessage}}-{{index}}-{{item.message}}</li>
</ul>
</div>
<script src="js/vue.js"></script>
<script>
var app = new Vue({
el: "#app-7",
data: {
parentMessage:"parent",
items: [
{ message: "foo" },
{ message: "bar" }
]
}
})
</script>
</body>
你也可以用of代替in作为分隔符 <div v-for="item of items"></div>
如同v-if模板,你也可以用带有v-for的<template>标签来渲染多个元素块,最后渲染的不含template元素
<body class="">
<div id="app-7">
<ul>
<template v-for="item in items">
<li>firstline</li>
<li>line</li>
</template>
</ul>
</div>
<script src="js/vue.js"></script>
<script>
var app = new Vue({
el: "#app-7",
data: {
items: [
{ message: "foo" },
{ message: "bar" }
]
}
})
</script>
</body>
对象迭代v-for 你也可以用v-for通过一个对象的属性来迭代,value为foo 与 bar
<body class="">
<div id="app-7">
<ul>
<li v-for="value in object">{{value}}</li>
</ul>
</div>
<script src="js/vue.js"></script>
<script>
var app = new Vue({
el: "#app-7",
data: {
object: { firstname: "foo", lastname: "bar" },
}
})
</script>
</body>
你也可以提供第二个参数为键名,第三个参数为索引
<body class="">
<div id="app-7">
<ul>
<li v-for="(value,key,index) in object">{{key}}:{{value}}-{{index}}</li>
</ul>
</div>
<script src="js/vue.js"></script>
<script>
var app = new Vue({
el: "#app-7",
data: {
object: { firstname: "foo", lastname: "bar" },
}
})
</script>
</body>
整数迭代v-for 结果显示12345678910
<body class="">
<div id="app-7">
<span v-for="n in 10">{{n}}</span>
</div>
<script src="js/vue.js"></script>
<script>
var app = new Vue({
el: "#app-7",
})
</script>
</body>
官网例子todo改成不用组件的写法
<body class="">
<div id="app-7">
<input type="text" placeholder="please enter new text" v-model="newtext" v-on:keyup.enter="addlist">
<ul>
<template v-for="(todo,index) in todos">
<li style="margin-bottom:20px;">{{todo.title}}
<button v-on:click="remove(index)">删除</button>
</li>
</template>
</ul>
</div>
<script src="js/vue.js"></script>
<script>
var app = new Vue({
el: "#app-7",
data: {
newtext: "",
todos: [
{ id: 1, title: "firsttile" },
{ id: 2, title: "secondtile" },
{ id: 3, title: "thirdtitle" }
],
nexttodoid: 4
},
methods: {
addlist: function() {
this.todos.push({ id: this.nexttodoid++, title: this.newtext })
this.newtext = ""
},
remove:function(index){
this.todos.splice(index,1)
}
}
})
//this.todos.push({ id: this.nexttodoid++, }) 不能改成id: ++this.nexttodoid,++在前面是
//先自加再赋值,
</script>
</body>
官网例子todo用组件的写法
<body class="">
<div id="todo-list-example">
<input placeholder="please endter the new text"
v-model="newTodoText" v-on:keyup.enter="addNewTodo">
<ul>
<item-compoent v-for="(todo,index) in todos" v-bind:title="todo.title"
v-on:remove="todos.splice(index,1)">
</item-compoent>
</ul>
</div>
<script src="js/vue.js"></script>
<script>
Vue.component("item-compoent",{
props:["title"],
template:`
<li>{{title}}<button v-on:click="$emit('remove')">删除</button></li>
`
})
var app7 = new Vue({
el: '#todo-list-example',
data: {
newTodoText:'',
todos: [
{id:1,title:"do the dishes"} ,
{id:2,title:"take out the trash"} ,
{id:3,title:"mow the lawn"},
],
nextid:4
},
methods:{
addNewTodo:function(){
this.todos.push({id:this.nextid++,title:this.newTodoText});
this.newTodoText =""
}
}
})
</script>
</body>
//1、当在input中输入数据后,按回车下面的列表增加一项,原理是在input中写上v-model的属性,用于与data里面的newTodoText双向绑定,同时v-on:keyup.enter 是按enter键后执行addNewTodo方法,实例的方法是在todos新增一项,并且把input清空 //2、父模板数据不能直接传递到子组件模板,需要在子组件中定义props属性像props:["title"],父模板绑定title并赋值,因为例子中的li含有按钮,点击按钮抛出子组件remove,父组件接收remove并执行todos.splice(index,1)意思是从下标index开始删除1项
v-for与v-if v-for的优先级比v-if高,意味着v-if将分别重复运行于每个v-for循环中 <li v-for="todo in todos" v-if="todo.isComplete">{{ todo }}</li> 上面的代码只传递了未complete的todos 而如果你的目的是有条件的跳过循环的执行,那么将v-if置于包装元素(或<template>上)
<ul v-if="shouldRenderTodos">
<li v-for="todo in todos">
{{ todo }}
</li>
</ul>
key 为了给vue一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供唯一的key属性 <div v-for="item in items" v-bind:key="item.id"> </div> 建议尽量使用v-for来提供key
数组更新检测 变异方法 Vue包含一组观察数组的变异方法,所以它们也将会触发视图更新,这些方法如下: push() pop() shift() unshift() splice() sort() reverse()
push的用法例子
<body class="">
<div id="todo-list-example">
<ul>
<li v-for="item in items">
{{ item.message }}
</li>
</ul>
<input v-model="newtext">
<button v-on:click="addlist">追加</button>
</div>
<script src="js/vue.js"></script>
<script>
var example1 = new Vue({
el: '#todo-list-example',
data: {
newtext:"",
items: [
{ message: 'Foo' },
{ message: 'Bar' }
]
},
methods:{
addlist:function(){
this.items.push({message:this.newtext});
this.newtext=""
}
}
})
</script>
</body>
重塑数组 变异方法顾名思义,会改变被这些方法调用的原始数组,相比之下也有非变异方法 filter(),concat()和slice(),这3个不会改变原始数组,总是返回一个新数组,当使用非变异方法时,可以用新的数组代替旧数组,性能依然很高效 example1.items = example1.items.filter(function (item) { return item.message.match(/Foo/) }) filter用法
<body class="">
<div id="todo-list-example">
<ul>
<li v-for="item in items">
{{ item.message }}
</li>
</ul>
<button v-on:click="addlist">过滤</button>
</div>
<script src="js/vue.js"></script>
<script>
var example1 = new Vue({
el: '#todo-list-example',
data: {
newtext: "",
items: [
{ message: 'Foo' },
{ message: 'Bar' }
]
},
methods: {
addlist: function() {
this.items = this.items.filter(function(item) {
return item.message.match(/Foo/);
})
}
}
})
</script>
</body>
注意事项 由于JavaScript的限制,Vue不能检测以下变动的数组 1、当你利用索引值直接设置一个项时例如vm.items[indexOfItem]=newValue 2、当你修改数组的长度时例如:vm.items.length = newLength 为了解决第一类问题,以下2种方法都可以实现 Vue.set(example.items,indexOfItem,newValue) example.items.splice(indexOfItem,1,newValue)
解决第二个问题可以用splice example1.items.splice(newLength)
显示过滤/排序结果 有时候我们需要显示一个数组的过滤或排序副本,而不是实际改变或重置原始数据,在这种情况下,可以创建返回过滤或排序数组的计算属性
<body class="">
<div id="example-1">
<span v-for="n in evennumber" >{{n}}</span>
</div>
<script src="js/vue.js"></script>
<script>
var app7 = new Vue({
el: '#example-1',
data: {
numbers:[1,2,3,4,5,6,7,8]
},
computed:{
evennumber:function(){
return this.numbers.filter(function(number){
return number%2===0
})
}
}
})
</script>
</body>
在计算属性不适合的情况下(例如,在嵌套v-for循环中)可以使用method方法
<body class="">
<div id="example-1">
<span v-for="n in evennumber(numbers)" >{{n}}</span>
</div>
<script src="js/vue.js"></script>
<script>
var app7 = new Vue({
el: '#example-1',
data: {
numbers:[1,2,3,4,5,6,7,8]
},
methods:{
evennumber:function(numbers){
return numbers.filter(function(number){
return number%3===0
})
}
}
})
</script>
</body>
或者
<body class="">
<div id="example-1">
<span v-for="n in evennumber()" >{{n}}</span>
</div>
<script src="js/vue.js"></script>
<script>
var app7 = new Vue({
el: '#example-1',
data: {
numbers:[1,2,3,4,5,6,7,8]
},
methods:{
evennumber:function(){
return this.numbers.filter(function(number){
return number%2===0
})
}
}
})
</script>
</body>
(adsbygoogle = window.adsbygoogle || []).push({});
- 【翻译】使用Visual Studio创建Asp.Net Core MVC (一)
- 你不知道的Javascript:有趣的setTimeout
- ADO.NET 2.0 中的新增 DataSet 功能
- WinRar 4.20 – 文件扩展名欺骗(0Day)
- 黑掉ATM取款机?只需一条短信
- DNS迭代穷举脚本
- 走进计算机取证分析的神秘世界
- SYNPROXY:最廉价的抗DoS攻击方案
- 如何使用AndroidStudio将开源项目library发布到jcenter
- Android Studio 使用Gradle多渠道打包
- 某些浏览器中因cookie设置HttpOnly标志引起的安全问题
- 偷懒新姿势,打造属于RecyclerView的万能适配器Adapter和ViewHolder
- 科普哈希长度扩展攻击(Hash Length Extension Attacks)
- 分析 WordPress 3.8.2 修復的cookie偽造漏洞
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 这是我的第一篇文章
- Android自定义View实现五子棋游戏
- AndroidQ(10)黑暗模式适配的实现
- Android仿微信录音功能
- android实现截图并动画消失效果的思路详解
- 位运算判断奇偶数
- Kotlin之在Gradle中无参(no-arg)编译器插件的使用详解
- android实现常驻通知栏遇到的问题及解决办法
- Android仿微信键盘切换效果
- Android实现WIFI和GPRS网络的切换
- 在VS2010里快要疯掉的hello world
- gh0st源码分析与远控的编写(三)
- Android自定义View实现五星好评效果
- Android通过ViewModel保存数据实现多页面的数据共享功能
- Android自定义View实现炫酷进度条