遍历数组

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

注意:当在组件上使用 v-for 时,key 现在是必须的。key的作用,帮助vue区分不同的元素,从而提高性能。

// tempalte模版
<ul>
     <li v-for="(item, index) in list" :key="item.message">
           {{ index }}:{{ item }}
     </li>
</ul>

// 业务逻辑
var vm = new Vue({
      el: '#app',
      data: {
           list: ['html', 'css', 'javascript', 'es6', 'ajax', 'vue']
      }
});
// 显示结果如下:

再来看一个稍复杂的例子

// template模版
<div id="app">
     <ul>
           <li v-for="item in items" :key="item.message">
                {{ item.message }}
           </li>
     </ul>
</div>

// 业务逻辑
var vm = new Vue({
      el: '#app',
      data: {
           items: [{
                  message: 'Foo'
               },
               {
                  message: 'Bar'
                }
           ]
      }
});

// 显示结果如下:

在 v-for 块中,我们可以访问所有父作用域的 property。v-for 还支持一个可选的第二个参数,即当前项的索引。

// template模版
<ul>
     <li v-for="(item, index) in items" :key="item.message">
            {{ parentMessage }}-{{ index }}-{{ item.message }}
      </li>
</ul>

// 业务逻辑
 data: {
    parentMessage: 'Parent',
    items: [{
               message: 'Foo'
          },
          {
               message: 'Bar'
          }
    ]
}

// 显示结果如下:

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

<div v-for="item of items"></div>

遍历对象

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

// template模版
<ul>
      <li v-for="value in object">
            {{ value }}
      </li>
</ul>  

// 业务逻辑
var vm = new Vue({
     el: '#app',
     data: {
          object: {
               title: 'How to do lists in Vue',
               author: 'Jane Doe',
               publishedAt: '2016-04-10'
         }
     }
});  

// 显示结果如下:

  (列表渲染)循环结构_模版

你也可以提供第二个的参数为 property 名称 (也就是键名):

<div v-for="(value, name) in object">
      {{ name }}: {{ value }}
</div>

// 显示结果如下:
 (列表渲染)循环结构_模版_02

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

// template模版
<ul>
     <li v-for="(item,name, index) in object" :key="item.message">
           {{ index }} {{ name}}:{{ item }}
     </li>
</ul>

// 显示结果如下:

数组更新检测

#改变原数组

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

push()
pop()
shift()
unshift()
splice()
sort()
reverse()

你可以打开控制台,然后对前面例子的 items 数组尝试调用变更方法。比如

vm.items.push({ message: 'Baz' });

显示结果如下:

(列表渲染)循环结构_javascript_03

#不改变原数组

它们不会变更原始数组,而总是返回一个新数组。当使用非变更方法时,可以用新数组替换旧数组:

filter()
concat() 
slice()

显示过滤/排序后的结果

有时,我们想要显示一个数组经过过滤或排序后的版本,而不实际变更或重置原始数据。在这种情况下,可以创建一个计算属性,来返回过滤或排序后的数组。

例如:

// template模版
<li v-for="n in evenNumbers">{{ n }}</li>

// 业务逻辑
data: {
  numbers: [ 1, 2, 3, 4, 5 ]
},
computed: {
  evenNumbers: function () {
    return this.numbers.filter(function (number) {
      return number % 2 === 0
    })
  }
}

// 显示结果为:
// 2,4,6

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

// template 模版
<ul v-for="set in sets">
  <li v-for="n in even(set)">{{ n }}</li>
</ul>

// 业务逻辑
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
    })
  }
}

// 2、4
// 6、8、10

在v-for里使用值范围

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

<div>
  <span v-for="n in 10">{{ n }} </span>
</div>

// 12345678910