美文网首页
vue2.0之 v-for

vue2.0之 v-for

作者: 何心猿意马 | 来源:发表于2018-02-03 22:28 被阅读0次

    用 v-for 把一个数组对应为一组元素

    <ul id="example-1">
      <li v-for="item in items">
        {{ item.message }}
      </li>
    </ul>
    
    var example1 = new Vue({
      el: '#example-1',
      data: {
        items: [
          { message: 'Foo' },
          { message: 'Bar' }
        ]
      }
    })
    

    在 v-for 块中,我们拥有对父作用域属性的完全访问权限。v-for 还支持一个可选的第二个参数为当前项的索引。

    <ul id="example-2">
      <li v-for="(item, index) in items">
        {{ parentMessage }} - {{ index }} - {{ item.message }}
      </li>
    </ul>
    var example2 = new Vue({
      el: '#example-2',
      data: {
        parentMessage: 'Parent',
        items: [
          { message: 'Foo' },
          { message: 'Bar' }
        ]
      }
    })
    

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

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

    一个对象的 v-for

    可以用 v-for 通过一个对象的属性来迭代

    <ul id="v-for-object" class="demo">
      <li v-for="value in object">
        {{ value }}
      </li>
    </ul>
    
    new Vue({
      el: '#v-for-object',
      data: {
        object: {
          firstName: 'John',
          lastName: 'Doe',
          age: 30
        }
      }
    })
    

    也可以提供第二个的参数为键名

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

    第三个参数为索引

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

    key

    建议尽可能在使用 v-for 时提供 key,除非遍历输出的 DOM 内容非常简单,或者是刻意依赖默认行为以获取性能上的提升。

    数组更新检测

    变异方法

    • push() 后面添加
    • pop() 后面删除
    • shift() 前面删除
    • unshift() 前面添加
    • splice() 向数组添加删除元素
    • sort() 顺序排序
    • reverse() 倒序排序

    对象更改检测注意事项

    例如:filter(), concat() 和 slice()
    总是返回一个新数组

    Vue 不能检测对象属性的添加或删除:

    var vm = new Vue({
      data: {
        a: 1
      }
    })
    // `vm.a` 现在是响应式的
    
    vm.b = 2
    // `vm.b` 不是响应式的
    

    对于已经创建的实例,Vue 不能动态添加根级别的响应式属性。但是,可以使用 Vue.set(object, key, value) 方法向嵌套对象添加响应式属性

    var vm = new Vue({
      data: {
        userProfile: {
          name: 'Anika'
        }
      }
    })
    

    添加一个新的 age 属性到嵌套的 userProfile 对象

    Vue.set(vm.userProfile, 'age', 27)
    

    还可以使用 vm.$set 实例方法,它只是全局 Vue.set 的别名

    vm.$set(vm.userProfile, 'age', 27)
    

    需要为已有对象赋予多个新属性

    vm.userProfile = Object.assign({}, vm.userProfile, {
      age: 27,
      favoriteColor: 'Vue Green'
    })
    

    显示过滤/排序结果

    想要显示一个数组的过滤或排序副本,而不实际改变或重置原始数据

    <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
        })
      }
    }
    

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

    <li v-for="n in even(numbers)">{{ n }}</li>
    
    data: {
      numbers: [ 1, 2, 3, 4, 5 ]
    },
    methods: {
      even: function (numbers) {
        return numbers.filter(function (number) {
          return number % 2 === 0
        })
      }
    }
    

    一段取值范围的 v-for

    v-for 也可以取整数

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

    v-for on a <template>

    <ul>
      <template v-for="item in items">
        <li>{{ item.msg }}</li>
        <li class="divider"></li>
      </template>
    </ul>
    

    v-for with v-if

    当它们处于同一节点,v-for 的优先级比 v-if 更高,这意味着 v-if 将分别重复运行于每个 v-for 循环中

    <li v-for="todo in todos" v-if="!todo.isComplete">
      {{ todo }}
    </li>
    

    如果你的目的是有条件地跳过循环的执行,那么可以将 v-if 置于外层元素 (或 <template>)上

    <ul v-if="todos.length">
      <li v-for="todo in todos">
        {{ todo }}
      </li>
    </ul>
    <p v-else>No todos left!</p>
    

    一个组件的 v-for

    2.2.0+ 的版本里,当在组件中使用 v-for 时,key 现在是必须的。

    相关文章

      网友评论

          本文标题:vue2.0之 v-for

          本文链接:https://www.haomeiwen.com/subject/nqjuzxtx.html