列表渲染
1.用v-for把一个数组对应为一组元素
可以用v-for指令基于一个数组来渲染一个列表。v-for指令需要使用item in items形式的特殊语法,其中items是源数据数组,而item则是被迭代的数组元素的别名。
<!DOCTYPE html> <html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>学习example</title> <script src="../static/vue.js" type="text/javascript" charset="utf-8"></script> </head> <body> <div id="app"> <ul> <li v-for="item in items"> {{item.message}} </li> </ul> </div> <script type="text/javascript"> var vm = new Vue({ el: "#app", data: { items: [ {message: 'Foo'}, {message: 'Bar'}, ] }, }); </script> <style type="text/css"> </style> </body> </html>
2.在v-for块中,可以访问所有父作用域的property。v-for还支持一个可选的第二个参数,即当前项的索引。
<!DOCTYPE html> <html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>学习example</title> <script src="../static/vue.js" type="text/javascript" charset="utf-8"></script> </head> <body> <div id="app"> <ul> <li v-for="item,index in items"> {{parentMessage}} {{index}} : {{item.message}} </li> </ul> </div> <script type="text/javascript"> var vm = new Vue({ el: "#app", data: { parentMessage: 'Parent', items: [ {message: 'Foo'}, {message: 'Bar'}, ] }, }); </script> <style type="text/css"> </style> </body> </html>
3.在v-for里使用对象
<!DOCTYPE html> <html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>学习example</title> <script src="../static/vue.js" type="text/javascript" charset="utf-8"></script> </head> <body> <div id="app"> <ul> <li v-for="value in object"> {{value}} </li> </ul> </div> <script type="text/javascript"> var vm = new Vue({ el: "#app", data: { object: { title: 'how to do lists in vue', author: 'jane doe', publishedAt: "2020-09-20", } }, }); </script> <style type="text/css"> </style> </body> </html>
4.提供第二个参数为property名称(也就是键名),第三个参数作为索引。
<!DOCTYPE html> <html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>学习example</title> <script src="../static/vue.js" type="text/javascript" charset="utf-8"></script> </head> <body> <div id="app"> <ul> <li v-for="(value,name,index) in object"> {{index}} - {{name}} - {{value}} </li> </ul> </div> <script type="text/javascript"> var vm = new Vue({ el: "#app", data: { object: { title: 'how to do lists in vue', author: 'jane doe', publishedAt: "2020-09-20", } }, }); </script> <style type="text/css"> </style> </body> </html>
5.维护状态
当Vue正在更新使用v-for渲染的元素列表时,它默认使用“就地更新”的策略。如果数据项的顺序被改变,Vue将不会移动DOM元素来匹配数据项的顺序,而是就地更新每个元素,并且确保它们在每个索引位置正确渲染。
这个默认的模式是高效的,但是只适用于不依赖子组件状态或临时DOM状态的列表渲染输出。
为了给Vue一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一key attribute。
建议尽可能在使用v-for时提供key attribute,除非遍历输出的DOM内容非常简单,或者是刻意依赖默认行为以获取性能上的提升。
因为它是Vue识别节点的一个通用机制,key并不仅与v-for特别关联。
<!DOCTYPE html> <html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>学习example</title> <script src="../static/vue.js" type="text/javascript" charset="utf-8"></script> </head> <body> <div id="app"> <ul> <li v-for="(value,name,index) in object" :key="index"> {{index}} - {{name}} - {{value}} </li> </ul> <ul> <li v-for="item,index in items" :key="index"> {{item.message}} </li> </ul> </div> <script type="text/javascript"> var vm = new Vue({ el: "#app", data: { object: { title: 'how to do lists in vue', author: 'jane doe', publishedAt: "2020-09-20", }, items: [ {message: 'Foo'}, {message: 'Bar'}, ] }, }); </script> <style type="text/css"> </style> </body> </html>
6.数组检测更新
(1).变更方法
Vue将被侦听的数组的变更方法进行了包裹,所以它们也将会触发视图更新。这些被包裹过的方法包括:push() pop() shift() unshift() splice() sort() reverse()
(2).替换数组
变更方法,顾名思义,会变更调用了这些方法的原始数组。相比之下,也有非变更方法,例如 filter()
、concat()
和 slice()
。它们不会变更原始数组,而总是返回一个新数组。当使用非变更方法时,可以用新数组替换旧数组
<!DOCTYPE html> <html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>学习example</title> <script src="../static/vue.js" type="text/javascript" charset="utf-8"></script> </head> <body> <div id="app"> <ul> <li v-for="item,index in items" :key="index"> {{item.message}} </li> </ul> </div> <script type="text/javascript"> var vm = new Vue({ el: "#app", data: { items: [ {message: 'Foo'}, {message: 'Bar'}, ] }, }); vm.items = vm.items.filter(function (item) { return item.message.match(/Foo/); }) </script> <style type="text/css"> </style> </body> </html>
7.显示过滤或排序后的结果
想要显示一个数组经过过滤或排序后的版本,而不实际变更或重置原始数据。在这种情况下,可以创建一个计算属性,来返回过滤或排序后的数组。
<!DOCTYPE html> <html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>学习example</title> <script src="../static/vue.js" type="text/javascript" charset="utf-8"></script> </head> <body> <div id="app"> <ul> <li v-for="n in evenNumbers"> {{n}} </li> </ul> </div> <script type="text/javascript"> var vm = new Vue({ el: "#app", data: { numbers: [1, 2, 3, 4, 5] }, computed: { evenNumbers: function fn() { return this.numbers.filter(function (number) { return number % 2 === 0; }) } } }) </script> <style type="text/css"> </style> </body> </html>
在计算属性不适用的情况下 (例如,在嵌套 v-for
循环中) 你可以使用一个方法:
<!DOCTYPE html> <html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>学习example</title> <script src="../static/vue.js" type="text/javascript" charset="utf-8"></script> </head> <body> <div id="app"> <ul v-for="set in sets"> <li v-for="n in even(set)"> {{n}} </li> </ul> </div> <script type="text/javascript"> var vm = new Vue({ el: "#app", data: { sets: [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]] }, methods: { even: function (numbers) { return numbers.filter(function (num) { return num % 2 === 0; }) } } }) </script> <style type="text/css"> </style> </body> </html>