亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

vue.js實現條件渲染的實例代碼

2019-11-19 16:16:44
字體:
來源:轉載
供稿:網友

一、初探條件渲染

vue 的條件渲染,仍舊依賴于指令系統,下面逐個介紹:

(1)v-if

<div id="app">  <div v-if="c1">c1</div></div>......var app = new Vue({  el: '#app',  data: {    c1: false  }});

當 c1 為真值的時候,渲染出 v-if 所綁定的元素,否則不渲染出該元素。渲染結果如下:

<div id="app"></div>

(2)v-else

<div id="app">  <div v-if="c1">c1</div>  <div v-else>c1 is not true</div></div>......var app = new Vue({  el: '#app',  data: {    c1: false  }});

當 c1 為真值的時候,渲染 v-if 所綁定的元素,否則渲染 v-else 所綁定的元素。這里值得注意的是,在 Handlebars 模板引擎里面,else 可以和 each 所搭配,當遍歷次數為0的時候,則渲染 else 塊所對應的內容;而對于 vue,官方給出的說法是,每個 v-else 所綁定語句必須綁定在 v-if 或者 v-else-if 語句的后面。一開始我還抱有一絲希望地去試了一下,結果。。。

遍歷次數為0的時候,v-else 綁定的元素沒有渲染出來,而且控制臺還報錯了。

個人感覺,在這一方面,vue 的模板引擎可能有所欠缺。雖然說,我們可以利用在循環中添加條件判斷實現相同的功能,但卻需要添加額外的代碼。

(3)v-else-if

<div id="app">  <div v-if="c1">c1</div>  <div v-else-if="c2">c2</div></div>......var app = new Vue({  el: '#app',  data: {    c1: false,    c2: true  }});

這里先檢查 c1 是否為真值,是則渲染出 v-if 綁定的元素,否則檢查 c2 是否為真值,是則渲染出 v-else-if 所綁定的元素。如果 c1 / c2 都不為真值,則都不渲染。渲染結果如下:

<div id="app">  <div>c2</div></div>

不難理解,v-if、 v-else、 v-else-if 跟類 C 語言中的 if、else、else if 功能相仿。

二、條件渲染優化

除了提供跟類 C 語言中的 if、else、else if 相似的功能以外,vue 還為開發者提供了性能優化方案。

(1)v-show

v-show 有著和 v-if 相似而又不同的功能,v-if 依賴于控制 DOM 節點,而 v-show 是依賴于控制 DOM 節點的 display 屬性。

<div id="app">  <div v-show="c4">c4</div></div>......var app = new Vue({  el: '#app',  data: {    c4: false  }});

當 v-show 綁定的值為真值的時候,節點正常渲染;當為假值的時候,節點仍舊渲染,但是添加了 style="display:none;",將節點通過 CSS 的方式隱藏。渲染結果如下:

<div id="app">  <div style="display: none;">c4</div></div>

相比于 v-if,v-show 其實不管在什么條件下,一開始都會進行節點的渲染,而后續的狀態切換都是基于 CSS 實現的。針對狀態需要頻繁切換狀態的節點,v-show 相對于直接修改 DOM 節點的 v-if 有更好的性能。

然而,v-show 的缺點也是顯而易見的,不管初始條件如何,它都將進行 DOM 節點的渲染,這對首屏加載優化不一定是個好事情。

(2)key

在使用 v-if 等指令的時候,vue 會盡可能地復用已經渲染的元素,而不是全部地重頭渲染。例如一對綁定 v-if 與 v-else 的元素,如果二者內部 DOM 元素相同,則可能在所綁定數據改變時,只更新綁定了的屬性,其它通過用戶操作或者 JS 修改了的屬性將被保留。

<div id="app">  <form>    <div class="input-group" v-if="name">      <label for="name">name:</label>      <input type="text" name="name" placeholder="user name" />    </div>    <div class="input-group" v-else>      <label for="email">email:</label>      <input type="text" name="email" placeholder="email" />    </div>    <button v-on:click.prevent="toggle">toggle</button>  </form></div>......var app = new Vue({  el: '#app',  data: {    name: true  },  methods: {    toggle: function () {      this.name = ! this.name;    }  }});

這里就是如此,點擊 toggle 按鈕的時候,v-if 所綁定的值會切換,相應的,DOM 節點也會跟著切換,但是實際上,由于 vue 重用了 input 元素,切換的同時,用戶填寫的內容并沒有被清空。同理,label 元素在切換的工程中,其實也只是修改了 for 屬性和元素內的文字,并沒有銷毀原有 DOM 節點和生成新的 DOM節點。

但是 vue 做的這種優化并不總是為人們所需要的,不需要它的時候,我們為這個元素添加一個唯一的 key 值就可以了。

<div id="app">  <form>    <div class="input-group" v-if="name">      <label for="name">name:</label>      <input type="text" name="name" placeholder="user name" key="name" />    </div>    <div class="input-group" v-else>      <label for="email">email:</label>      <input type="text" name="email" placeholder="email" key="email" />    </div>    <button v-on:click.prevent="toggle">toggle</button>  </form></div>......var app = new Vue({  el: '#app',  data: {    name: true  },  methods: {    toggle: function () {      this.name = ! this.name;    }  }});

像這樣,為這兩個不需要“優化”的 input 元素添加了唯一標識的 key 以后,vue 便不會再復用這兩個元素。每次切換之后,修改的內容將不會被保留。

三、更多思考

(1)基于標簽的指令(v-bind 、v-if)

Handlebars 的 helpers 有自己獨立的語法,比如:

{{#if ok}} <h1>Yes</h1>{{/if}}

它定義了一組自己的語法。而實現同樣的功能,vue 使用類似于 v-bind、v-if 之類的指令,它們都是綁定在一個個標簽上面的,如

<h1 v-if="ok">Yes</h1>

這樣的語法更加簡潔、清晰。

Handlebars 的語法,支持同時綁定多個 DOM 節點。

{{#if ok}} <h1>Yes</h1> <h1>Yes</h1> <h1>Yes</h1>{{/if}}

按照前面的思路,難道 vue 要實現成這樣?

<h1 v-if="ok">Yes</h1><h1 v-if="ok">Yes</h1><h1 v-if="ok">Yes</h1>

那根本不可能,添加額外的 DOM 節點包裹住它們?那就更不可能。vue 擴展了一個 template 節點,使用的時候,我們可以像 HTML 節點一樣去使用它,但是渲染頁面的時候,它不會被渲染在頁面上。于是,前面的代碼可以實現成這樣:

<template v-if="ok"> <h1>Yes</h1> <h1>Yes</h1> <h1>Yes</h1></template>

想想,其實和 Handlebars 也差不多了,甚至顯得還要復雜些了,畢竟 template 這個單詞這么長~

(2)利用條件渲染字符串

前面說,v-if 等指令都是基于標簽的,那如果我不想創建額外的標簽,只是想按照條件去修改一個字符串呢?沒錯,你猜對了,template 節點,它里面除了可以存放節點,也可以直接存放字符串,就像這樣:

<div id="app">  <template v-if="c3">text</template></div>......var app = new Vue({  el: '#app',  data: {    c3: true  }});

渲染結果:

<div id="app">text</div>

這里其實也就是利用了 template 節點不會被渲染在頁面上的特性。

(3)屬性的“條件渲染”

既然 HTML 節點可以條件渲染,多個 HTML 節點可以條件渲染,HTML 節點內字符串可以條件渲染,那么 HTML 屬性呢?在編寫模板的時候,HTML 屬性其實也是字符串,我們能想上面那樣,利用 template 模板創建字符串作為 HTML 的屬性嗎?

復制代碼 代碼如下:

<div title="<template v-if='c3'>title content</template>">此處應有 title</div>

是不是一看就感覺怪怪的?vue 也這樣覺得,于是控制臺里就解析成了:

復制代碼 代碼如下:

<div title="<template v-if='c3'>title content</template>">此處應有 title</div>

中間的 <template v-if='c3'>title content</template> 整個的被識別成了字符串,那如果去掉外面的雙引號呢?

復制代碼 代碼如下:

<div title=<template v-if='c3'>title content</template>>此處應有 title</div>

好像看起來更奇怪了。最后的渲染結果:

<div title="<template">title content>此處應有 title</div>

vue 的模板解析不是簡單的依賴于字符串的解析,所以其實這里不能使用這種方法。正確的姿勢是利用 v-bind 指令:

<div v-bind:title="c3 ? 'title content' : '' ">title</div>

因為 v-bind 指令的預期值實際上可以接受 js 表達式的,這里我們傳入了一個條件表達式。當 c3 為真值的時候,渲染為 title="title content",當 c3 為假值的時候,渲染為 title=""。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产在线观看一区二区三区| 98精品国产自产在线观看| 色综合老司机第九色激情| 欧美性猛交xxxx免费看久久久| 欧美黄色小视频| 亚洲乱码av中文一区二区| 欧美贵妇videos办公室| 欧美又大又硬又粗bbbbb| 91手机视频在线观看| 91高潮在线观看| 亚洲自拍偷拍一区| 91精品国产91久久久久久久久| 亚洲精品视频在线观看视频| 国产精品白嫩美女在线观看| 亚洲成人黄色网| 欧美性猛交xxxx乱大交3| 欧美做受高潮1| 亚洲第一区中文99精品| 欧美大片欧美激情性色a∨久久| 国产精品高潮呻吟久久av野狼| 色与欲影视天天看综合网| 成人免费直播live| 日本精品va在线观看| 欧美激情视频在线| 伊人久久久久久久久久久久久| 97碰在线观看| 亚洲国产古装精品网站| 日韩亚洲欧美中文高清在线| 在线性视频日韩欧美| 国产精品免费电影| 伊人久久久久久久久久久| 欧美成人久久久| 国产日韩欧美在线播放| 欧美日韩亚洲国产一区| 日韩免费在线视频| 欧美性jizz18性欧美| 国产精品女主播视频| 高清日韩电视剧大全免费播放在线观看| 日本精品久久电影| 国产精品一区二区女厕厕| 久久久久久久久久av| 91日本视频在线| 日日骚久久av| www.欧美精品一二三区| 中文字幕免费国产精品| 欧美成年人视频网站欧美| 欧美福利视频在线| 91免费看片网站| 欧美xxxx14xxxxx性爽| 久久精品99久久久香蕉| 亚洲人av在线影院| 亚洲aa在线观看| 午夜精品蜜臀一区二区三区免费| 国产性猛交xxxx免费看久久| 美女999久久久精品视频| 国产欧美日韩视频| 国产精品美女在线| 国产精品久久av| 欧美激情精品久久久久久| 91亚洲国产成人精品性色| 日韩av大片在线| 亚洲国产精品成人精品| 国产亚洲欧洲高清| 亲子乱一区二区三区电影| 日韩av电影手机在线| 69久久夜色精品国产7777| 欧美性猛交xxxx免费看| 国产亚洲精品一区二555| 亚洲女成人图区| 亚洲一区免费网站| 国产精品影院在线观看| 欧美日韩一区二区三区| 国产精品稀缺呦系列在线| 国产在线a不卡| 欧美日韩国产黄| 91影院在线免费观看视频| 国产精品嫩草视频| 国产精品久久久久久久久久新婚| 日av在线播放中文不卡| 久久亚洲精品国产亚洲老地址| 欧美激情啊啊啊| 亚洲人永久免费| 伦理中文字幕亚洲| 亚洲男人的天堂在线| 亚洲欧美中文日韩v在线观看| 色狠狠av一区二区三区香蕉蜜桃| 亚洲国产第一页| 色爱精品视频一区| 中文字幕日韩在线观看| 欧美人成在线视频| 国产91精品视频在线观看| 日韩av免费在线播放| 成人精品视频久久久久| 8x海外华人永久免费日韩内陆视频| 亚洲电影第1页| 亚洲人成五月天| 亚洲深夜福利视频| 久久国产精品99国产精| 亚洲欧美日韩国产中文专区| 色婷婷综合成人| 欧美精品少妇videofree| 亚洲国产精品女人久久久| 一区二区欧美久久| 97视频在线观看播放| 久久久精品一区| 欧美日韩中文字幕日韩欧美| 中文字幕亚洲一区在线观看| 日本久久精品视频| 国产精品福利无圣光在线一区| 欧美激情国内偷拍| 日本道色综合久久影院| 国产成人鲁鲁免费视频a| 亚洲18私人小影院| 久久精品国产精品亚洲| 日本一本a高清免费不卡| 26uuu亚洲国产精品| 色悠悠久久88| 欧美久久精品一级黑人c片| 欧美成人精品一区| 精品激情国产视频| 国模精品一区二区三区色天香| 亚洲黄在线观看| 欧美一区二区三区图| 色噜噜狠狠狠综合曰曰曰| 成人网在线观看| 欧美午夜www高清视频| 日韩大陆毛片av| 久久久久久国产精品久久| 日本亚洲欧洲色α| 亚洲高清不卡av| 全色精品综合影院| 国产精品极品美女粉嫩高清在线| 欧美一区第一页| 亚洲影视九九影院在线观看| 亚洲精品国产精品乱码不99按摩| 国产日韩在线视频| 91丨九色丨国产在线| 亚洲欧美成人在线| 欧美高清激情视频| 亚洲国产成人一区| 国产成人在线一区二区| 国产一区二区日韩| 久久99国产精品自在自在app| 欧美激情视频三区| 日韩美女在线观看| 国产区精品在线观看| 亚洲系列中文字幕| 精品久久中文字幕久久av| 久久久久久久国产精品| 亚洲国产另类久久精品| 最近2019年日本中文免费字幕| 亚洲综合色av| 日韩一区二区av| 中文字幕在线成人| 欧美日韩国产限制| 日韩hd视频在线观看| 欧美精品日韩三级| 中文字幕在线国产精品| 亚洲国产精品久久| 国内精品久久久久久| 在线视频欧美日韩| 日韩黄色在线免费观看| 91精品国产色综合久久不卡98口| 亚洲香蕉伊综合在人在线视看|