列表渲染

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


我们用 v-for 指令根据一组数组的选项列表进行渲染。v-for 指令需要使用 item in items 形式的特殊语法, items 是源数据数组并且 item 是数组元素迭代的别名。

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

结果:

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

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

结果:

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

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

一个对象的 v-for


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

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

结果:

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

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

结果:

第三个参数为索引:

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

注意:在遍历对象时,是按 Object.keys() 的结果遍历,但是不能保证它的结果在不同的JavaScript引擎下是一致的。

 key


当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用“就地复用”策略。如果数据项的顺序被改变。Vue将不会移动dom元素来匹配数据项的顺序,而是简单复用此处的每个元素,并且确保它在特定索引下显示已被渲染过的每个元素。这个类似Vue 1.x的 track-by="$index" 

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

为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,我们需要为每一项提供一个唯一的 key 属性。理想的 key 值是每项都有的且唯一的id。这个特殊的属性相当于 Vue 1.x 的 Track-by ,但它的工作方式类似于一个属性,所以你需要用 v-bind 来帮顶动态值(在这里使用简写):

 <div v-for="item in items" :key="item.id">                                    HTML
   <!-- 内容 -->
 </div>

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

因为它是Vue识别节点的一个通用机制, key 并不与 v-for 特别关联 , key 还具有其他用途,我们将在后面的指南中看到其他用途。

数据更新检测


变异方法

Vue包含一组观察数组的变异方法,所以它们也将会触发视图更新。这些方法如下:

——  push()

——  pop()

——  shift()

——  unshift()

——  splice()

——  sort()

——  reverse()

替换数组

变异方法(mutation method),顾名思义,会改变被这些方法调用的原始数组。相比之下,也有非变异(non-mutating method)方法,例如:filter()、concat()、slice()。这些不会改变原始数组,但总是返回一个新数组。当使用非变异方法时,可以用新数组替换旧数组:

example1.items = example1.items.filter(function (item) {                              JS
  return item.message.match(/Foo/)
})

注意事项

对象更改检测注意事项


还是由于JavaScript的限制,Vue不能检测对象属性的添加或删除

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

 vm.b = 2
 // `vm.b` 不是响应式的

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

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

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

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

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

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

有时你可能为需要为已有对象赋予多个新属性,比如使用Object.assign() 或 _.extend() 。在这种情况下你应该用两个对象的属性创建一个新的对象。所以,如果你想添加新的响应式属性,不要像这样:

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

你应该这样做:

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

显示过滤/排序效果


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

例如:

<li v-for="n in evenNumbers">{{ n }}</li>                                      HTML
data: {                                                           JS
  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>                                    HTML
 data: {                                                        JS
   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>


类似于 v-if ,你也可以利用带有 v-for 的<template>渲染多个元素。比如:

<ul>                                                            HTML
  <template v-for="item in items">
    <li>{{ item.msg }}</li>
    <li class="divider" role="presentation"></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">                                HTML
  {{ todo }}
</li>

上面的代码只传递了未完成的todos。

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

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

vue基础——列表渲染的更多相关文章

  1. vue基础---列表渲染

    首先简单回顾下v-for‘指令 <ol id="list_area"> <li v-for="book in books">{{book ...

  2. 【03】Vue 之列表渲染及条件渲染

    3.1. 条件渲染 有时候我们要根据数据的情况,决定标签是否进行显示或者有其他动作.最常见的就是,表格渲染的时候,如果表格没有数据,就显示无数据.如果有数据就显示表格数据. Vue帮我们提供了一个v- ...

  3. 一起学Vue之列表渲染

    在Vue开发中,列表数据绑定非常简单易用,本文主要通过一些简单的小例子,讲述v-for的使用方法,仅供学习分享使用,如有不足之处,还请指正. 用 v-for 把一个数组对应为一组元素 我们可以用 v- ...

  4. 前端框架之Vue(6)-列表渲染

    用v-for把一个数组对应为一组元素 我们用 v-for 指令根据一组数组的选项列表进行渲染. v-for 指令需要使用 item in items 形式的特殊语法, items 是源数据数组并且 i ...

  5. vue之列表渲染

    一.v-for循环用于数组 v-for 指令根据一组数组的选项列表进行渲染. 1.v-for 指令需要使用 item in items 形式的特殊语法,items 是源数据数组名, item 是数组元 ...

  6. vue笔记-列表渲染

    用v-for把一个数组对应为一组元素 使用方法:v-for="(item,index) in items"//也可以使用of替代in { items:源数组 item:数组元素迭代 ...

  7. vue基础——条件渲染

    一.v-if 1.1.v-if,v-else 在字符串模板中,比如Handlebars,我们得像这样写一个条件块: HTML <!-- Handlebars 模板 --> {{#if ok ...

  8. vue基础---条件渲染

    (1)v-if条件渲染 v-if 指令用于条件性地渲染一块内容.这块内容只会在指令的表达式返回 truthy 值的时候被渲染. 可以用 v-else 添加一个“else 块”: ①表达式 <di ...

  9. 02 . Vue入门基础之条件渲染,列表渲染,事件处理器,表单控件绑定

    vue基础 声明式渲染 Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统 Example1 <!DOCTYPE html> <html> ...

随机推荐

  1. 推荐10款优秀的JavaScript Web UI库 框架和套件

    在进行Web开发时,并非所有的库都适合你的项目,但真正开发的时候,你任然需要依赖一款UI框架.特别在你时间紧迫的时候,它是你忠实的朋友. 他们都是些广泛使用包含不同语言实现的WEB UI框架.今天我就 ...

  2. commonJS规范基本结构

    commonJS规范:使用 module.exports 和 require ,基本结构如下: // foo.js 输出模块 module.exports = function(x) { consol ...

  3. Jquery获取元素高度

    第一步, 获取你要得到高度的那个div的jQuery对象, 获得方法有很多很多种, 具体你可以看一下jQuery API文档里的选择器部分, 在这里我只跟你说一个最直接的方法, 通过id获得: $(& ...

  4. 【Spring学习笔记-5.1】Spring容器-父子容器

    来自为知笔记(Wiz)

  5. bzoj3503 和谐矩阵

    Description 我们称一个由0和1组成的矩阵是和谐的,当且仅当每个元素都有偶数个相邻的1.一个元素相邻的元素包括它本身,及他上下左右的4个元素(如果存在).给定矩阵的行数和列数,请计算并输出一 ...

  6. 一些css杂项笔记

    div[class*="col-"]{ background-color: gold; border: 1px solid #ccc; } //给class开头等于col-的div ...

  7. java 使用jxl poi 操作excel

    java操作excel  创建.修改 xls 文件 JAVA操作Excel文件 Java生成和操作Excel文件 java导出Excel通用方法 Java 实现导出excel表 POI Java PO ...

  8. 1061 Dating (20 分)

    1061 Dating (20 分) Sherlock Holmes received a note with some strange strings: Let's date! 3485djDkxh ...

  9. ESXI 5.5加载 zabbix OVF 3.2.6操作

    如果是虚拟机安装ZABBIX,ZABBIX的前台WEB时间,是由虚拟机的BIOS时间决定的. 一. 1.去官方下载vmdk磁盘镜像 链接地址为https://sourceforge.net/proje ...

  10. echo off

    就是说关闭回显 @echo off并不是DOS程序中的,而是DOS批处理中的.当年的DOS,所有操作都用键盘命令来完成,当你每次都要输入相同的命令时,可以把这么多命令存为一个批处理,从此以后,只要运行 ...