# Vue.js 學習旅程Mile 12 – Conditional Rendering 條件渲染篇:v-if、v-show ###### tags: `w3HexSchool` `Vue` `Javascript` ## v-if 設定 `v-if` 的元素只會在其 Value 為 Truthy 時被渲染。 ```htmlmixed= <div id="app"> <span v-if="isA">A</span> </div> ``` ```javascript= var vm = new Vue({ el: '#app', data: { isA: true } }); ``` 當 isA 為 true 時,\<span>A</span\> 會出現在畫面上,但當 isA 為 false 時,\<span>A</span\> 整個 DOM 會不存在於 HTML 內。 ### v-else、v-else-if 可以搭配 `v-else-if` 和 `v-else` 來做判斷運算。 ```htmlmixed= <div id="app"> <div v-if="type === A">A</div> <div v-else-if="type === B">B</div> <div v-else>C</div> </div> ``` ```javascript= var vm = new Vue({ el: '#app', data: { type: "B" } }); ``` #### 注意事項 * `v-else` 沒有 Value ,它是一個單純的 Directive。 * `v-else-if` 可以使用多次。 * `v-else-if` 跟 `v-else` 相同必須緊跟在 `v-if` 或是 `v-else-if` 設置元素之後,而且必須是同一層的元素。 ### 使用 template 包裹多層元素 因為 `v-if` 只能使用在一個元素上,所以當需要多個元素做切換時,可以使用 `<template>` 這個標籤把多個元素包裹起來。 `<template>` 標籤只做包裹元素之用,實際被渲染出來時,並不存在,因此不影響原本網頁元素的配置。 ```htmlmixed= <span v-if="isA">A1</span> <span v-if="isA">A2</span> <span v-if="isA">A3</span> ``` 等同於下例 ```htmlmixed= <template v-if="isA"> <span>A1</span> <span>A2</span> <span>A3</span> </template> ``` ### 使用 key 決定可重覆使用的元素 Vue 會儘可能高效地渲染元素。如果是相同的結構則會繼續沿用原本的 DOM 元素,並不會重新渲染,用這個方法減少重新渲染所需的資源以提高效能。 ```htmlmixed= <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> ``` 切換 loginType 將不會清除使用者已經輸入的內容。因為兩個模板使用了相同的元素,`<input>` 不會被替換掉,只是替換了它的 `placeholder`。 所以 Vue 提供了一種方式來表達“這兩個元素是完全獨立的,不要重複使用它們”。只需要添加一個具有**唯一值**的 `key` attribute 即可: ```htmlmixed= <template v-if="loginType === 'username'"> <label>Username</label> <input placeholder="Enter your username" key="username-input"> </template> <template v-else> <label>Email</label> <input placeholder="Enter your email address" key="email-input"> </template> ``` ## v-show `v-show` 跟 `v-if` 在頁面上的效果相同,都是決定元素是否顯示,但其渲染的方式不同。 * `v-if` : 真正的建立及銷毀元素。 * `v-show` : 元素始終會被渲染並保留在 DOM 中,只是使用 `display` 的樣式屬性切換顯示效果。 ```htmlmixed= <span v-show="isA">A</span> ``` 等同於下例: ```htmlmixed= <span style="display: none;">A</span> ``` #### 注意事項 * `v-show` 不支持 `<template>` 元素,也不支持 `v-else`。 ## v-if vs v-show 比較兩者在渲染時所需消耗的資源與效能: * 在初始渲染時,有元素其值為 false :`v-show` > `v-if` * 若需頻繁切換元素狀態:`v-if` > `v-show` ## 參考資料 * [Vue.js - Conditional Rendering](https://vuejs.org/v2/guide/conditional.html) * [Vue.js: 條件渲染 v-if、v-show](https://cythilya.github.io/2017/04/22/vue-conditional-rendering/) * [Vue.js Core 30天屠龍記(第12天): 條件渲染](https://ithelp.ithome.com.tw/articles/10205764)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up