v-if的做用html
這個指令對你們來講應該太熟悉了,它用來條件性的渲染所選中的dom元素。這塊內容只會在指令的表達式返回 truthy 值的時候被渲染。若是咱們想要去控制多個元素呢?在vue中咱們可使用< template >這個元素來進行包裹,有點像文檔碎片,並不會產生一個無用的新標籤,但依舊能夠達到目的!vue
v-else和v-else-if數組
故名思議,我想你們懂的都懂。值得注意的是,他們倆都只能牢牢跟隨在帶v-if元素以後,中間能夠有註釋,可是堅定不能有多餘的元素或者文本,不然會報錯。bash
key值的做用dom
Vue會盡量快的去渲染元素,那它就會複用一些元素,我們來看一下下面這個例子(取自官方文檔)。性能
<template v-if="myInput"> // myInput初始值爲 true
<label>username:</label>
<input placeholder="Enter your username">
</template>
<template v-else>
<label>password:</label>
<input placeholder="Enter your password">
</template>
<button @click="myInput = !myInput"></button>
複製代碼
當myInput的值是true的時候,用戶能夠輸入username,當點擊按鈕時,username框消失,password框出現。可是vue爲了提升性能,一看,哎呀這label元素和input元素兩邊都有呀,那我乾脆不用徹底清楚掉嘛,我給它換個屬性,換個文本不就行了。學習
這樣一來,Vue渲染的更快,可是也有個問題,由於複用了input元素,那在切換以後,password框內顯示的是剛纔在username中輸入的值,這怎麼辦呢?咱們如何來告訴vue,這倆input框不是一個玩意兒,你不準複用。 屬性keyui
<template v-if="myInput">
<label>username:</label>
<input placeholder="Enter your username" key="input1">
</template>
<template v-else>
<label>password:</label>
<input placeholder="Enter your password" key="input2">
</template>
<button @click="myInput = !myInput"></button>
複製代碼
解決!可是要注意的一點是,咱們只給input框添加了不一樣的key值,而label元素並無,因此label元素仍然會被Vue高效的複用哦~spa
v-show的做用code
和v-if做用同樣!!!也是根據表達式返回 truthy值來進行相應操做的。
並非說他倆一塊兒出如今同一元素上就報錯,就很差使,不是這樣的。是由於v-for會比v-if擁有更高的優先級,會形成v-for白忙活一場。舉個栗子~(我的理解,歡迎指正)
<ul>
<li v-for="item in items" v-if="item.isShow" ></li>
</ul>
複製代碼
在這個demo裏,咱們要去遍歷出一大堆item,而後根據item上的isShow屬性來判斷是否須要渲染。因爲v-for的優先級高於v-if,因此一旦頁面加載,或者items發生改變,咱們都須要把這個數組遍歷一遍(v-for),而後再去挨個判斷v-if的狀況。這樣子,就算這個元素不須要渲染,咱們也遍歷了一回。假設有100個item,可是隻有一個item.isShow是真值,那咱不就虧大了?爲了它一個元素,遍歷一個數組,浪費我這麼多性能。因此,咱們可使用computed,先計算出渲染列表,再對其進行遍歷。
<li v-for="item in activeItems" ></li>
computed:{
activeItems(){
return ...
}
}
複製代碼