条件渲染与列表渲染

条件渲染

v-if指令

  • ​ 利用v-if指令,可以实现在同一页面,不同的时期,根据需要渲染显示不同的块或模板<template>,实现不同的功能需求,从而提高页面的复用率。不同于Angular的*ngIf,在Vue中还提供了v-else指令,来表示v-if的else块。在2.1.0中还新增了v-else-if指令,顾名思义,充当v-if的else if块,类似一般编程语言中的控制语句(if--else if--else),v-else-if可以链式地使用多次。
<div v-if="type === 'A'">A</div>
<div v-else-if="type === 'B'"> B</div>
<div v-else-if="type === 'C'">C</div>
<div v-else>Not A/B/C</div>
  • 值得注意的是类似v-elsev-else-if必须跟在v-if或者v-else-if元素之后。

v-show指令

  • v-show也是一个根据条件展示选项的指令。用法大致一样:

    <h1 v-show="ok">Hello!</h1>

  • 不同的是带有v-show的元素始终会被渲染并保留在DOM中,本质上讲,v-show只是简单的切换元素的css属性display。并且,v-show不支持<template>语法和v-else指令。

v-ifv-show的区别与应用场景

  • v-if是正真的条件渲染,因为v-if是惰性的,如果在初始渲染时条件为假,则什么也不做一直到条件第一次变为真时,才会开始渲染条件块。同时,他会确保在切换过程中条件块内的时间监听器和子组件适当地销毁和重建。
  • v-show则不管初始条件是什么,元素总会被渲染,并且只是简单的基于css进行切换。
  • 一般来说,v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用 v-show 较好;如果在运行时条件不太可能改变,则使用 v-if 较好。

列表渲染

v-for渲染一个数组

  • 我们用v-for指令根据一组数组的选项列表进行渲染,该指令需要使用item in items形式的特殊语法,items是源数据数组,并且item是数组元素迭代的别名。在v-for块,我们对父作用域属性有完全的访问权限,v-for还支持一个可选的第二个参数为当前项的索引。(也可以用of代替in,因为他是最接近javascript迭代器的语法)
<ul id="example-2">
  <li v-for="(item, index) in items">
    {{ parentMessage }} - {{ index }} - {{ item.message }}
  </li>
</ul>
let example2 = new Vue({
  el: '#example-2',
  data: {
    parentMessage: 'Parent',
    items: [
      { message: 'Foo' },
      { message: 'Bar' }
    ]
  }
})

v-for渲染一个对象

  • 我们也可以用v-for通过一个对象的属性来迭代,我们可以提供第二个可选参数为键名,第三个可选参数为索引。在遍历对象时,是按Object.keys()的结果遍历的,但是不能保证他的结果在不同的Javascript引擎下是一致的。建议尽可能在使用 v-for 时提供 key,除非遍历输出的 DOM 内容非常简单,或者是刻意依赖默认行为以获取性能上的提升。因为它是 Vue 识别节点的一个通用机制,key 并不与 v-for 特别关联,key 还具有其他用途。
<div v-for="(value, key, index) in object">
  {{ index }}. {{ key }}: {{ value }}
</div>
let vm = new Vue({
  el: '#v-for-object',
  data: {
    object: {
      firstName: 'John',
      lastName: 'Doe',
      age: 30
    }
  }
})

v-for渲染一段取值范围

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

输出:1 2 3 4 5 6 7 8 9 10

v-for渲染<template>和组件

  • 类似v-if,我们也可以用带有v-for<template>渲染多个元素或者直接渲染一个组件。比如:
<ul>
  <template v-for="item in items">
    <li>{{ item.msg }}</li>
    <li class="divider"></li>
  </template>
</ul>
  • 在自定义组件中,我们可以像任何普通元素一样使用v-for。在2.2.0+的版本中,当在组件中使用v-for时,key是必须的。
<my-component
  v-for="(item, index) in items"
  v-bind:item="item"
  v-bind:index="index"
  v-bind:key="item.id"
></my-component>
  • 不自动将 item 注入到组件里的原因是,这会使得组件与 v-for 的运作紧密耦合。明确组件数据的来源能够使组件在其他场合重复使用。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容

  • 条件渲染 条件渲染,就满足一定的条件以后才会渲染。 v-if v-if指令类似于,js中的if语句,当条件满足时才...
    Oldboyyyy阅读 1,662评论 0 0
  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 5,046评论 0 29
  • 1.安装 可以简单地在页面引入Vue.js作为独立版本,Vue即被注册为全局变量,可以在页面使用了。 如果希望搭建...
    Awey阅读 11,003评论 4 129
  • Vue 实例 属性和方法 每个 Vue 实例都会代理其 data 对象里所有的属性:var data = { a:...
    云之外阅读 2,204评论 0 6
  • 1 早晨在室外的运河边跑步时,看到了孩子们在教练的带领下训练轮滑,小运动员们表现的很专业,非常可爱!这些孩子们是明...
    LiHongxi阅读 108评论 0 0