Vuejs
v-if
✐v-if
指令可以決定是否渲染元素,該元素只有在填入的 expression
為 truthy
時會渲染。
下方為簡單範例,當 type
被切換時,畫面重新渲染,v-if
expression
為 falsy
的元素將被銷毀,反之為 truthy
的元素將被建立:
const vm = new Vue({
name: "vm",
el: '#app',
template: `
<div id="app">
<p v-if="type === 'A'">渲染這個 ⏰</p>
<p v-else-if="type === 'B'">渲染那個 ⏱</p>
<p v-else="type === 'C'">渲染最後 ⏲</p>
</div>
`,
data: {
type: 'B'
},
});
更改 type
影響 expression
結果,下圖可以看到如下重新渲染過程:
v-else
、v-else-if
連用 ✐如同 if
、else
,v-if
可以與指令 v-else
、v-else-if
連用。
v-else-if
前一個 兄弟元素
需要為 v-if
、v-else-if
v-else
前一個 兄弟元素
需要為 v-if
、v-else-if
const vm = new Vue({
name: "vm",
el: '#app',
template: `
<div id="app">
<p v-if="type === 'A'">渲染這個 ⏰</p>
<p v-else-if="type === 'B'">渲染那個 ⏱</p>
<p v-else="type === 'C'">渲染最後 ⏲</p>
</div>
`,
data: {
type: 'B'
},
});
<template>
,條件渲染多個內容 ✐若要同時條件渲染多個元素,可以使用 <template>
包裹。
const vm = new Vue({
name: "vm",
el: "#app",
template: `
<div id="app">
<template v-if="loginType === 'username'">
<label>Username</label>
<input placeholder="Enter your username" >
</template>
<template v-else>
<label>Email</label>
<input placeholder="Enter your email address">
</template>
<button @click="change">BTN</button>
</div>
`,
data: {
loginType: "username",
},
methods: {
change() {
this.loginType = "other";
},
},
});
key
管理複用元素 ✐Vue
會高效的渲染元素,通常會 復用
既有元素並且 重新渲染
部分 相異之處
而非 從頭渲染
,這帶給我們更為高效的渲染速度,但是在部分情況下,也會帶來問題。渲染 input
時,由於並非從頭渲染,而是替換掉了 placeholder
,在切換時 value
仍然存留,會帶來以下問題:
我們可以看到由於渲染時並非重新渲染的整個 input
而是替換了 placeholder
,於是用戶輸入的 value
仍存在。
此時可以使用 key
來解決該問題,表達元素是 完全獨立
的,Vue
遇到 key
時會基於 key
變化重新排列元素順序,並且移除 key
不存在的元素。
更改後加上 key
的代碼:
const vm = new Vue({
name: "vm",
el: "#app",
template: `
<div id="app">
<template v-if="loginType === 'username'">
<label>Username</label>
<input placeholder="Enter your username" key="user">
</template>
<template v-else>
<label>Email</label>
<input placeholder="Enter your email address" key="email">
</template>
<button @click="change">BTN</button>
</div>
`,
data: {
loginType: "username",
},
methods: {
change() {
this.loginType = "other";
},
},
});
可以看到 input
綁上 key
後,被整個重新渲染,剛剛的問題也迎刃而解。
同樣是條件,v-show
是使用 display:none
決定元素是否顯示在畫面中,元素始終會被渲染。
const vm = new Vue({
name: "vm",
el: "#app",
template: `
<div id="app">
<label v-show="value">A</label>
<label v-show="!value">B</label>
<button @click="change">BTN</button>
</div>
`,
data: {
value: false,
},
methods: {
change() {
this.value = !this.value;
},
},
});
透過切換 display
,v-show
得以達到切換元素顯現的效果。
同為條件渲染,v-if
與 v-show
差別總結如下:
v-if
所條件渲染的元素會隨 expression
渲染、銷毀,並且確保相關的事件監聽器、子組件被適當地銷毀、重建,總結來說 v-if
有更高的切換開銷,每切換一次就要重新渲染,不適用於頻繁切換的元素。
v-show
所條件渲染的元素總是渲染,使用 CSS
進行切換。v-show
初始渲染成本較高,但是切換時開銷不高,適用於頻繁切換顯示的元素。
以上為此次內容,感謝看到這裡的你,我們明天見。
若是文中有任何錯誤、錯字、想討論的內容,歡迎各位大大不吝鞭笞指正、交流分享,筆者不慎感激 ✦ ✦ ✦
▶︎ 筆者 github:https://github.com/YUN-RU-TSENG
▶︎ 老王賣瓜之筆者另一篇鐵人:每天來點 CSS Specification
▶︎ 倘若不斷向深處扎根,似乎就能茁壯成長 - RM