列表渲染

用把一个数组对应为一组元素


v-for指令基于一个数组来渲染一个列表。v-for指令需要使用item in items形式的特殊语法,其中items是元数据数组,而item则是被迭代的数组元素的别名

列:


    
        {{item.message}}
    

//数据
data() {
    return {
        items:[
            {message:"A"},
            {message:"B"},
            {message:"C"},
            {message:"D"}
        ]
    }
},

v-for语句块中,可以访问所有福作用域的属性。v-for还支持一个可选的第二个参数,即当前项的索引。


    
        {{parentTitle}} -- {{index}} -- {{item.message}}
    


data() {
   return {
       parentTitle:"标题",
           items:[
            {message:"A"},
            {message:"B"},
            {message:"C"},
            {message:"D"}
        ]
    }
},

也可以用of替代in作为分隔符,因为它更接近js迭代器的语法:

 

v-for里使用对象


也可以用v-for来遍历一个对象的属性。


    
        {{value}}
    


data() {
    return {
        object:{
            title:'平凡的世界',
            auther:'路遥',
            publishedAt:'2020-09-09'
        }
    }
},

也可以提供第二个参数作为属性名(键名):


    
        {{name}}:{{value}}
    

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

{{ index }}. {{ name }}: {{ value }}

在遍历对小时,会按Object.keys()的结果遍历,但是不能保证它的结果在不同的js引擎下都一致。

 

维护状态


当vue正在使用v-for渲染元素列表时,他默认使用的就是就地更新的策略。如果数据项的顺序改变,vue将不会移动DOM元素来匹配数据项的顺序,而是就地更新每个元素,并且确保他们在每个索引位置正确渲染。

这个默认模式是高效的,但是只适用于不依赖子组件状态或临时DOM状态(例如;表单输入值)的列表渲染输出。

为了给vue一个提示,以便他能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为没项提供一个唯一key的属性:

建议尽可能在使用v-for的时候提供key属性。

不要使用对象或数组之类的非基本类型值作为v-forkey。请使用字符串或者数值类型的值。
 

数组更新检测

变更方法

vue将被侦听的数组的变更方法进行了包裹,所以他们也将会触发视图更新。这些包裹过得方法包括:

  • push() 向数组的末尾添加新的元素
  • pop() 删除数组中的最后一个元素
  • shift() 删除数组的第一个元素
  • unshift() 在数组的开头添加元素
  • splice() 在数组的第2位置添加一个元素
  • sort() 数组排序
  • reverse() 数组中的元素翻转
替换数组

变更方法:顾名思义,会变更调用了这些方法的原始数组。相比之下,也有非变更方法,如:
filter()concat()slice()。它们不会变更原数组,而总是返回一个新数组,当使用非变更方法时,可以用新数组替换旧数组:

example1.items = example1.items.filter(function (item) {
  return item.message.match(/Foo/)
})
注意事项

由于js的限制,vue不能检测数组和对象的变化。
 

显示过滤/排序后的结果


若想要显示一个数组经过过滤或排序后的版本,而不实际变更或充值原始数据。在这种情况下,可以创建一个计算属性,来返回过滤或排序后的数组。
例如:

  • {{ n }}
  • data: { numbers: [ 1, 2, 3, 4, 5 ] }, computed: { //定义一个计算属性 evenNumbers: function () { return this.numbers.filter(function (number) { return number % 2 === 0 }) } }

    在计算属性不适用的情况下(如,在嵌套v-for循环中)你可以适用一个方法:

    • {{ n }}
    data: { sets: [[ 1, 2, 3, 4, 5 ], [6, 7, 8, 9, 10]] }, methods: { //定义一个方法 even: function (numbers) { return numbers.filter(function (number) { return number % 2 === 0 }) } }

     

    v-for里使用值范围


    v-for也可以接受整数,在这种情况下,他会把模板重复对应次数。

    {{ n }}

    结果:

    1 2 3 4 5 6 7 8 9 10