Vue.js - Vue 中的條件渲染

Vue 中的條件渲染


今天說一下 Vue 中的條件渲染端仰,通俗的說就是條件判斷泳猬,判斷各種條件是否執(zhí)行戚长。

新建一個最簡單的 Vue 實例 :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Vue 中的條件渲染</title>
    <script src="./vue.js"></script>
</head>
<body>
    <div id="app">
        
    </div>

    <script>
        var app = new Vue({
            el: "#app"
        })
    </script>
</body>
</html>

先介紹一個 v-if 指令盗冷,編輯一下代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Vue 中的條件渲染</title>
    <script src="./vue.js"></script>
</head>
<body>
    <div id="app">
         <!-- 新指令 v-if -->
        <div v-if="show">{{ message }}</div>
    </div>

    <script>
        var app = new Vue({
            el: "#app",
            data: {
                show: false,
                message: "Hello World"
            }
        })
    </script>
</body>
</html>

v-if 等于后面跟著的依然是一個 JavaScript 表達(dá)式,這個表達(dá)式的 truefalse 同廉,也就是它的返回值決定了這個 div 標(biāo)簽是否被真實的掛載到頁面之上仪糖「趟荆看一下上面的代碼,我在 data 里定義了兩個數(shù)據(jù)锅劝, shwomessage 攒驰,show 是一個布爾值,也就是真假, message 是一個人普通字符串?dāng)?shù)據(jù)牙勘,之前也看過很多次了橄仍。我們把 show 放到 v-if 后面的雙引號里,現(xiàn)在 show 的值是 false 奶段,很顯然這個元素就不會掛載在頁面上,在瀏覽器上我們看不到 Hello World 的輸出剥纷。打開瀏覽器看一下:

showfalse 時痹籍,<div v-if="show">{{ message }}</div> 沒有掛載到頁面上。我們在控制臺將 show 的值更改為 true 晦鞋,觀察一下效果:

Hello World 顯示了出來蹲缠,div 標(biāo)簽也添加了到 thml 里。當(dāng) v-iftrue 時元素就會添加進(jìn)去悠垛,為 false 時就會刪除线定。

還有一個跟 v-if 效果很類似的指令 v-show ,它兩都可以讓元素顯示隱藏确买,不過也是有點不一樣的斤讥,添加一下代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Vue 中的條件渲染</title>
    <script src="./vue.js"></script>
</head>
<body>
    <div id="app">
        <div v-if="show"> v-if :{{ message }}</div>
         <!-- 添加的代碼 --> 
        <div v-show="show">v-show :{{ message }}</div>
    </div>

    <script>
        var app = new Vue({
            el: "#app",
            data: {
                show: false,
                message: "Hello World"
            }
        })
    </script>
</body>
</html>

加多了一個 <div v-show="show">{{ message }}</div>v-show 用的變量也是 show 湾趾,打開瀏覽器芭商,會看到如圖:

因為一開始它兩的 show 都為 false ,所以都沒有顯示出來搀缠,但是 v-showdiv 標(biāo)簽已經(jīng)掛載到了 html 文件里铛楣。

Console 修改一下 show 的值改為 true:

兩個 div 標(biāo)簽里的內(nèi)容都顯示了出來, v-ifdiv 標(biāo)簽也能在 html 文件上看得到:

進(jìn)行對比,v-ifv-show 都可以控制一個模板標(biāo)簽是否在頁面上顯示艺普。當(dāng) v-if 指令只要對應(yīng)的變量值為 false 簸州,它所對應(yīng)的標(biāo)簽不存在于 DOM 頁面之上,就是還沒有創(chuàng)建出來歧譬。只有當(dāng)它為 true 顯示出來時岸浑,才會把它創(chuàng)建出來。而 v-showdiv 元素早已創(chuàng)建好在 DOM 頁面之上瑰步,只是加了個 display: none 屬性助琐,讓它隱藏了起來,為 true 也只是把 display: none 給去掉了而已面氓。

在需要頻繁切換隱藏顯示的時候兵钮, v-show 的性能會比 v-if 好很多蛆橡。因為 v-if 每次都要對整個標(biāo)簽進(jìn)行添加和刪除。

v-if 有一個跟它配對的指令掘譬,v-else泰演,修改一下代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Vue 中的條件渲染</title>
    <script src="./vue.js"></script>
</head>
<body>
    <div id="app">
        <!-- v-else 必須跟 v-if 相鄰 -->
        <div v-if="show">{{ message }}</div>
        <div v-else>Bye World</div>
    </div>

    <script>
        var app = new Vue({
            el: "#app",
            data: {
                show: false,
                message: "Hello World"
            }
        })
    </script>
</body>
</html>

打開瀏覽器,會發(fā)現(xiàn)顯示在頁面上的是 Bye World

當(dāng)我們把 show 給成 true 的時候葱轩,Hello World 就出來了:

這就是 v-ifv-else 的簡單組合使用睦焕,記住,它們兩個必須相鄰寫在一起Qス啊@啊!

還有這么一個組合 v-if 袜炕、v-else-if 本谜、v-else 三個的組合, v-else-if 可以在中間添加多個進(jìn)行判斷偎窘,修改代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Vue 中的條件渲染</title>
    <script src="./vue.js"></script>
</head>
<body>
    <div id="app">
        <!-- v-else 必須跟 v-if 相鄰 -->
        <div v-if="show === 'a'">This is A</div>
        <div v-else-if="show === 'b'">This is B</div>
        <div v-else>This is others</div>
    </div>

    <script>
        var app = new Vue({
            el: "#app",
            data: {
                show: "a"
            }
        })
    </script>
</body>
</html>

message 這個數(shù)據(jù)刪除了乌助,show 改成了一個字符串 a 。打開瀏覽器會看到 This is A陌知,因為 show 的默認(rèn)值是 a 他托,我們在 Console 調(diào)試窗口分別修改成 ba 、b 以外的值看看效果:

對應(yīng)的判斷條件會輸出對應(yīng)的 div 標(biāo)簽仆葡,顯示不同的結(jié)果赏参,這就是 v-ifv-else-if 沿盅、v-else 的使用方法把篓。

講一種比較特殊的情況,修改一下代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Vue 中的條件渲染</title>
    <script src="./vue.js"></script>
</head>
<body>
    <div id="app">
        <div v-if="show">
            用戶名:<input />
        </div>
        <div v-else>
            密  碼:<input />
        </div>
    </div>

    <script>
        var app = new Vue({
            el: "#app",
            data: {
                show: true
            }
        })
    </script>
</body>
</html>

打開瀏覽器嗡呼,操作一下:

會發(fā)現(xiàn)纸俭,當(dāng)我們進(jìn)行切換的時候皇耗,輸入框里的內(nèi)容并沒有清除南窗,這是為什么呢?

因為 v-if 郎楼、v-else 万伤、v-else-if 這三個指令有一個盡量復(fù)用已有的標(biāo)簽,來增加渲染的速度呜袁,也就是說有共同標(biāo)簽的情況下敌买,不會進(jìn)行修改,只修改發(fā)生變化的部分阶界,那應(yīng)該怎樣解決這個問題呢虹钮?

我們采用一個 key 值的辦法聋庵。給兩個 <input /> 標(biāo)簽加上 key 。如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Vue 中的條件渲染</title>
    <script src="./vue.js"></script>
</head>
<body>
    <div id="app">
        <div v-if="show">
            用戶名:<input key="username"/>
        </div>
        <div v-else>
            密  碼:<input key="password"/>
        </div>
    </div>

    <script>
        var app = new Vue({
            el: "#app",
            data: {
                show: true
            }
        })
    </script>
</body>
</html>

再試一下上面的操作芙粱,看看結(jié)果如何:

這樣祭玉,剛剛出現(xiàn)的 bug 就沒用了。當(dāng)我們給元素加上 key 值之后春畔,Vue 會知道這是唯一的一個元素脱货,如果兩個的 key 值不一樣,就不會復(fù)用了律姨。


公眾號更精彩哦~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末振峻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子择份,更是在濱河造成了極大的恐慌扣孟,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缓淹,死亡現(xiàn)場離奇詭異哈打,居然都是意外死亡,警方通過查閱死者的電腦和手機讯壶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門料仗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人伏蚊,你說我怎么就攤上這事立轧。” “怎么了躏吊?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵氛改,是天一觀的道長。 經(jīng)常有香客問我比伏,道長胜卤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任赁项,我火速辦了婚禮葛躏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘悠菜。我一直安慰自己舰攒,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布悔醋。 她就那樣靜靜地躺著摩窃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪芬骄。 梳的紋絲不亂的頭發(fā)上猾愿,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天鹦聪,我揣著相機與錄音,去河邊找鬼蒂秘。 笑死椎麦,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的材彪。 我是一名探鬼主播观挎,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼段化!你這毒婦竟也來了嘁捷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤显熏,失蹤者是張志新(化名)和其女友劉穎雄嚣,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喘蟆,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡缓升,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蕴轨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片港谊。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖橙弱,靈堂內(nèi)的尸體忽然破棺而出歧寺,到底是詐尸還是另有隱情,我是刑警寧澤棘脐,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布斜筐,位于F島的核電站,受9級特大地震影響蛀缝,放射性物質(zhì)發(fā)生泄漏顷链。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一屈梁、第九天 我趴在偏房一處隱蔽的房頂上張望嗤练。 院中可真熱鬧,春花似錦俘闯、人聲如沸潭苞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至僧诚,卻和暖如春遮婶,著一層夾襖步出監(jiān)牢的瞬間蝗碎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工旗扑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蹦骑,地道東北人。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓臀防,卻偏偏與公主長得像眠菇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子袱衷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5捎废? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 27,513評論 1 45
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理致燥,服務(wù)發(fā)現(xiàn)登疗,斷路器,智...
    卡卡羅2017閱讀 134,701評論 18 139
  • ¥開啟¥ 【iAPP實現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程嫌蚤,因...
    小菜c閱讀 6,444評論 0 17
  • 2016.12.31,2016年的最后一天女仰,正好休息,看到易效能群里有同學(xué)會的線下活動抡锈,我很心動疾忍。于是,早上6點床三,...
    xyt月閱讀 336評論 0 0
  • 昨天說了粉底的質(zhì)感一罩,今天說說上粉底的工具。最常用的是粉底刷和海綿撇簿,粉底刷適用于粉底液和粉底霜聂渊,其中扁頭粉底刷對粉底...
    睿睿Dora閱讀 60評論 0 0