條件渲染與列表渲染

條件渲染

v-if指令

  • ? 利用v-if指令,可以實(shí)現(xiàn)在同一頁(yè)面,不同的時(shí)期,根據(jù)需要渲染顯示不同的塊或模板<template>,實(shí)現(xiàn)不同的功能需求,從而提高頁(yè)面的復(fù)用率。不同于Angular的*ngIf,在Vue中還提供了v-else指令,來(lái)表示v-if的else塊。在2.1.0中還新增了v-else-if指令,顧名思義,充當(dāng)v-if的else if塊,類(lèi)似一般編程語(yǔ)言中的控制語(yǔ)句(if--else if--else),v-else-if可以鏈?zhǔn)降厥褂枚啻巍?/li>
<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>
  • 值得注意的是類(lèi)似v-elsev-else-if必須跟在v-if或者v-else-if元素之后。

v-show指令

  • v-show也是一個(gè)根據(jù)條件展示選項(xiàng)的指令。用法大致一樣:

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

  • 不同的是帶有v-show的元素始終會(huì)被渲染并保留在DOM中,本質(zhì)上講,v-show只是簡(jiǎn)單的切換元素的css屬性display。并且,v-show不支持<template>語(yǔ)法和v-else指令。

v-ifv-show的區(qū)別與應(yīng)用場(chǎng)景

  • v-if是正真的條件渲染,因?yàn)?code>v-if是惰性的,如果在初始渲染時(shí)條件為假,則什么也不做一直到條件第一次變?yōu)檎鏁r(shí),才會(huì)開(kāi)始渲染條件塊。同時(shí),他會(huì)確保在切換過(guò)程中條件塊內(nèi)的時(shí)間監(jiān)聽(tīng)器和子組件適當(dāng)?shù)劁N(xiāo)毀和重建。
  • v-show則不管初始條件是什么,元素總會(huì)被渲染,并且只是簡(jiǎn)單的基于css進(jìn)行切換。
  • 一般來(lái)說(shuō),v-if 有更高的切換開(kāi)銷(xiāo),而 v-show 有更高的初始渲染開(kāi)銷(xiāo)。因此,如果需要非常頻繁地切換,則使用 v-show 較好;如果在運(yùn)行時(shí)條件不太可能改變,則使用 v-if 較好。

列表渲染

v-for渲染一個(gè)數(shù)組

  • 我們用v-for指令根據(jù)一組數(shù)組的選項(xiàng)列表進(jìn)行渲染,該指令需要使用item in items形式的特殊語(yǔ)法,items是源數(shù)據(jù)數(shù)組,并且item是數(shù)組元素迭代的別名。在v-for塊,我們對(duì)父作用域?qū)傩杂型耆脑L問(wèn)權(quán)限,v-for還支持一個(gè)可選的第二個(gè)參數(shù)為當(dāng)前項(xiàng)的索引。(也可以用of代替in,因?yàn)樗亲罱咏?code>javascript迭代器的語(yǔ)法)
<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渲染一個(gè)對(duì)象

  • 我們也可以用v-for通過(guò)一個(gè)對(duì)象的屬性來(lái)迭代,我們可以提供第二個(gè)可選參數(shù)為鍵名,第三個(gè)可選參數(shù)為索引。在遍歷對(duì)象時(shí),是按Object.keys()的結(jié)果遍歷的,但是不能保證他的結(jié)果在不同的Javascript引擎下是一致的。建議盡可能在使用 v-for 時(shí)提供 key,除非遍歷輸出的 DOM 內(nèi)容非常簡(jiǎn)單,或者是刻意依賴(lài)默認(rèn)行為以獲取性能上的提升。因?yàn)樗?Vue 識(shí)別節(jié)點(diǎn)的一個(gè)通用機(jī)制,key 并不與 v-for 特別關(guān)聯(lián),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>和組件

  • 類(lèi)似v-if,我們也可以用帶有v-for<template>渲染多個(gè)元素或者直接渲染一個(gè)組件。比如:
<ul>
  <template v-for="item in items">
    <li>{{ item.msg }}</li>
    <li class="divider"></li>
  </template>
</ul>
  • 在自定義組件中,我們可以像任何普通元素一樣使用v-for。在2.2.0+的版本中,當(dāng)在組件中使用v-for時(shí),key是必須的。
<my-component
  v-for="(item, index) in items"
  v-bind:item="item"
  v-bind:index="index"
  v-bind:key="item.id"
></my-component>
  • 不自動(dòng)將 item 注入到組件里的原因是,這會(huì)使得組件與 v-for 的運(yùn)作緊密耦合。明確組件數(shù)據(jù)的來(lái)源能夠使組件在其他場(chǎng)合重復(fù)使用。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 條件渲染 條件渲染,就滿足一定的條件以后才會(huì)渲染。 v-if v-if指令類(lèi)似于,js中的if語(yǔ)句,當(dāng)條件滿足時(shí)才...
    Oldboyyyy閱讀 1,765評(píng)論 0 0
  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容,還有我對(duì)于 Vue 1.0 印象不深的內(nèi)容。關(guān)于...
    云之外閱讀 5,175評(píng)論 0 29
  • 1.安裝 可以簡(jiǎn)單地在頁(yè)面引入Vue.js作為獨(dú)立版本,Vue即被注冊(cè)為全局變量,可以在頁(yè)面使用了。 如果希望搭建...
    Awey閱讀 11,296評(píng)論 4 129
  • Vue 實(shí)例 屬性和方法 每個(gè) Vue 實(shí)例都會(huì)代理其 data 對(duì)象里所有的屬性:var data = { a:...
    云之外閱讀 2,369評(píng)論 0 6
  • 1 早晨在室外的運(yùn)河邊跑步時(shí),看到了孩子們?cè)诮叹毜膸ьI(lǐng)下訓(xùn)練輪滑,小運(yùn)動(dòng)員們表現(xiàn)的很專(zhuān)業(yè),非常可愛(ài)!這些孩子們是明...
    LiHongxi閱讀 160評(píng)論 0 0

友情鏈接更多精彩內(nèi)容