天天看點

Vue 指令v-if、v-show、v-once和v-cloak

Vue 指令v-if、v-show、v-once和v-cloak

前面兩篇文章中總結了v-bind、v-on、v-for、v-model等指令的相關内容,這篇文章将總結v-if、v-show、v-once、v-cloak等指令的内容。

(1)條件渲染:v-if,v-else,v-else-if

v-if條件指令可以根據表達式的值在DOM中渲染或銷毀元素/元件,下面是v-if的用法示例:

<div id="app">
    <div v-if="see">
        現在你能看到我,如果改變app.see的值為false,你就看不到我啦!
    </div>
</div>
<script>
    var app=new Vue({
        el:"#app",
        data:{
          see:true
        }
    })
</script>
           
1.在<template>元素上使用v-if條件渲染分組

上面的代碼中,v-if隻能控制一個元素,要想控制多個元素,可以把<template>當作包裹元素,并在<template>上使用v-if。最終渲染的結果不包含template,如果使用div作為包裹元素,最終渲染的結果會包含div:

<div id="app">
  <template v-if="is">
      <div>1</div>
      <div>2</div>
      <div>3</div>
      <div>4</div>
  </template>

 <div v-if="is">
      <div>1</div>
      <div>2</div>
      <div>3</div>
      <div>4</div>
  </div>
</div>
<script>
    var app = new Vue({
        el: "#app",
        data: {
           is:true
        },
    })
</script>
           

渲染的結果為:

<div id="app">
      <div>1</div>
      <div>2</div>
      <div>3</div>
      <div>4</div>
      
  <div>
      <div>1</div>
      <div>2</div>
      <div>3</div>
      <div>4</div>
  </div>
</div>
           
2.可以使用v-else指令來表示v-if的"else"塊:
<div id="app">
    <div v-if="is">我是v-if塊</div>
    <div v-else>我是v-else塊</div>
</div>
<script>
    var app = new Vue({
        el: "#app",
        data: {
            is: true
        },
    })
</script>
           

渲染結果為:

<div id="app">
    <div>我是v-if塊</div>
</div>
           

v-else的元素必須緊跟在帶v-if或者v-else-if的元素後面,否則它不會被識别。

3.可以使用v-else-if充當v-if的的"else-if"塊
<div id="app">
    <div v-if="is===0">is的值為0</div>
    <div v-else-if="is===1">is的值為1</div>
    <div v-else-if="is===2">is的值為2</div>
    <div v-else-if="is===3">is的值為3</div>
    <div v-else>is的值不是0,1,2,3中的一個</div>
</div>
<script>
    var app = new Vue({
        el: "#app",
        data: {
            is: 1
        },
    })
</script>
           

渲染的結果為:

<div id="app">
    <div>is的值為1</div>
</div>
           

v-else-if的元素必須緊跟在帶v-if的元素後面,否則它不會被識别。

(2)條件渲染:v-show

v-show的用法與v-if的用法基本上是一緻的:

<div id="app">
    <div v-show="is">你好!</div>
</div>
<script>
    var app = new Vue({
        el: "#app",
        data: {
            is: true
        },
    })
</script>
           

渲染結果為:

<div id="app">
    <div>你好!</div>
</div>
           

下面是v-show與v-if的不同:

1.v-show不能在<template>上使用

v-if可以在<template>上使用,控制多個元素;而v-show是不支援<template>的。

<div id="app">
    <template v-show="is">
        <div>1</div>
        <div>2</div>
        <div>3</div>
    </template>
</div>
<script>
    var app = new Vue({
        el: "#app",
        data: {
            is: false
        },
    })
</script>
           
<div id="app">
    <template v-show="is">
        <div>1</div>
        <div>2</div>
        <div>3</div>
    </template>
</div>
<script>
    var app = new Vue({
        el: "#app",
        data: {
            is: true
        },
    })
</script>
           

無論is的值為false還是true,渲染的結果都是:

<div id="app">
    <div>1</div>
    <div>2</div>
    <div>3</div>
</div>
           
2.v-show切換css的display屬性,v-if會讓元素銷毀和重建

v-show:不管初始條件是true還是false,元素總會被渲染。在true與false互相變化時,它隻是簡單的切換css的display屬性。

v-if:在true與false的切換過程中,會讓元素銷毀和重建。如果初始條件為false,它什麼也不做,直到第一次條件變為true時才會渲染元素,如果之後條件又變為false,那麼它會銷毀元素。

<div id="app">
    <div v-if="is">這個元素使用了v-if</div>
    <div v-show="is">這個元素使用了v-show</div>
</div>
<script>
    var app = new Vue({
        el: "#app",
        data: {
            is: true
        },
    })
</script>
           

渲染結果為:

<div id="app">
    <div>這個元素使用了v-if</div>
    <div>這個元素使用了v-show</div>
</div>
           

當app.is的值變為false時,渲染結果為:

<div id="app">
    <div style="display:none;">這個元素使用了v-show</div>
</div>
           

一般來說,v-if 有更高的切換開銷,而 v-show 有更高的初始渲染開銷。是以,如果需要頻繁地切換條件,使用 v-show 較好;如果在運作時條件很少改變,則使用 v-if 較好。

(3)v-once

v-once是一個不需要表達式的指令。

定義了v-once的元素或元件隻渲染一次,包括元素或元件的所有子節點。首次渲染後,當資料改變時,插值處的内容不會再更新,綁定的類、id等也不會更新。

<div id="app" >
    <div v-once v-bind:class="left">{{message}}</div>
    <div v-once><span v-bind:id="left">{{message}}</span></div>
</div>
<script>
    var app = new Vue({
        el: "#app",
        data: {
            message: "你好!",
            left:"up"
        },
    });
    app.message="123";
    app.left="down";
</script>
           

渲染的結果為:

<div id="app" >
    <div class="up">你好!</div>
    <div><span id="up">你好!</span></div>
</div>
           

(4)v-cloak

v-cloak是一個不需要表達式的指令。

v-cloak 可以防止頁面加載時出現 vue.js 的變量名,需要與CSS的display:done一起配合使用。

<div id="app">
    {{message}}
</div>
<script>
    var app = new Vue({
        el: "#app",
        data: {
            message: "你好!"
        },
    })
</script>
           

對于上面代碼,當網速較慢、Vue.js檔案還沒有加載完成時,頁面上會顯示{{message}}字樣,直到Vue建立執行個體、編譯模闆時,DOM才會被替換,是以在網速較慢時,這個過程中螢幕是有閃動的。v-cloak 與CSS的display:done一起配合使用可以解決這個問題:

為元素加上v-cloak指令:

<div id="app" v-cloak>
    {{message}}
</div>
           

在CSS中添加:

[v-cloak] {
  display: none;
}
           

以上操作的意思是,包含 v-cloak屬性的 html 标簽在頁面初始化時會被隐藏,在 Vue執行個體結束編譯時,v-cloak 屬性會被自動去除,對應的标簽就會變為可見。也就不會再出現閃動的問題。

在一般情況下,v-cloak是解決初始化慢導緻頁面閃動的最佳實踐,對于簡單的項目很實用。但在具有工程化的項目中,可能不再需要v-cloak。

參考:

1.Vue.js官方文檔

2.《Vue.js實戰》

繼續閱讀