---
# System prepended metadata

title: Vue學習#11 Vue指令集 - 渲染(只能讀)資料
tags: [Vue, Vue 直播班 - 2022 春季班]

---

# Vue學習#11 Vue指令集 - 渲染(只能讀)資料
###### tags: `Vue 直播班 - 2022 春季班` `Vue`

## v-text {{}}
<font color=#AD3C86> **效果:** </font> 
純文字渲染，將 Vue data 呈現在畫面上

<font color=#AD3C86> **重點**</font>
v-text 渲染的結果會無視標籤內原本的內容

```=VUE
<!-- text: 'hello' -->

<div v-text="text">world!</div>
<!-- 只會印出 hello -->

<div>{{ text }} world!</div>
<!-- 會印出 hello world! -->
```

**[v-text跟 {{}} 範例](https://codepen.io/binlandz123/pen/YzYBOvd?editors=1010)**

## v-html
<font color=#AD3C86> **效果:** </font> 
類似 v-text，將 Vue data 呈現在畫面上

<font color=#AD3C86> **與 v-text 差異**</font>
就像是 `innerText` 跟 `innerHTML` 的差別

```=VUE
<!-- text: '<h1>hello!</h1>'-->

<div v-text="text"></div>
<!-- 畫面會顯示 <h1>hello!</h1> -->

<div v-html="text"></div>
<!-- 畫面會顯示 <h1>大標題並顯示 hello! -->
```

## v-if v-else v-else-if 
<font color=#AD3C86> **效果:** </font> 
用像是 if else 的條件判斷方式決定要渲染條件成立的區塊，指令的內容回傳為 true 會產生結構內容
<font color=#AD3C86> **重點:** </font>
1. 當 v-if 的結果為真值時，則會置入該區塊的結構內容
2. v-else, v-else-if 則為 v-if 的延伸運用，會延續著 v-if 的結構後方

**[v-if v-else v-else-if範例](https://codepen.io/binlandz123/pen/KKyNZJL)**

## v-show
<font color=#AD3C86> **效果:** </font> 與 v-if 同樣是用來切換物件的呈現，但兩者有差異
<font color=#AD3C86> **與 v-if 的差異點:** </font>
1. <font color='red' size=5>v-if 會完整移除 DOM 元素</font>，使其從 HTML 結構上消失。當使用此方法切換 Vue 元件時，<font color='red' size=5>元件的生命週期會重新計算</font>
2. v-show 是將物件加上 display: none，讓物件從視覺上不可見

**[v-show範例](https://codepen.io/binlandz123/pen/OJObzYo?editors=1010)**
<font color='red' size=5>請使用開發者工具檢視範例畫面上的「成功、失敗」區塊，可以發現是使用 display: none 的方式隱藏，而不是移除整個 DOM 結構
</font>

### v-if 跟 v-show 怎麼選
1. 當元件的生命週期需要在顯示時重新計算，如果需要就用 v-if ， 不需要就用 v-show
2. 當元件隱藏時，同時需要完整移除 DOM 結構，也可使用 v-if

## v-for

<font color=#AD3C86> **效果:** </font> 
一組陣列或物件進行渲染，指令中會使用 (item, key) in array 的語法
item => 陣列元素的別名，名稱可以自己定義
key => 陣列的 index
array => 陣列或是資料的來源
<font color=#AD3C86> **重點:** </font> 
1. v-for 的結構為 v-for="(item, key) in array"
2. 無論是陣列、物件都可以使用 v-for
3. 陣列的索引為 0, 1, 2...，物件索引則為屬性名稱

**[v-for 範例](https://codepen.io/binlandz123/pen/XWzpbRj)**

### v-for 的注意事項 - key
v-for 在運作上是採用快速替換的形式，在預設的狀況下，Vue.js 會儘量重覆使用已渲染好的元素，若不設定 key 值，不會重新渲染元素，只會部份更新。
用以下範例來了解 key 的重要性 :

<font size=4>**[v-for有key跟沒有key的差異](https://codepen.io/binlandz123/pen/YzENXxL)**</font>

* 當沒有 key 時，雖然反轉陣列元素會跟著反轉，但是改變元素的順序相對應的 input 卻不會跟著改變，意思就是元素並沒有全部被重新渲染，只有部分更新而已
* 加上 key ，確保每個元素的唯一性，當元素更新，例如改變順序時，有可識別唯一性的 key 來確保重新渲染

### Template 
渲染陣列資料卻不方便創造新標籤的時候，可以使用 `<template>` 標籤，此方法即可在產生 DOM 結構時不產生額外的標籤。另外 `<template>` 標籤也同樣可用於 v-for 上

* 可以使用 template 標籤替代原有的 HTML 標籤，而 template 標籤是不會被輸出的

[template範例](https://codepen.io/binlandz123/pen/ZEaLGdK?editors=1010)

### 避免 v-if 和 v-for 用在一起
<font color='red' size=5> v-for 的優先權大於 v-if </font>，因此當兩者皆出現在同一個元素上時，v-if 會隨著 v-for 重覆執行數次
<font color='red' size=5>v-for 的個數範圍判斷條件成立後，才會輪到 v-if 來判斷顯示與否</font>
<font color=#AD3C86> **重點:** </font>盡可能將 v-if 與 v-for 用不同的標籤呈現
<font color=#AD3C86>解決辦法: 加入 template 標籤 將 v-if 或 v-for 其一放入 template 標籤做判斷</font>
[v-if跟v-for範例](https://codepen.io/binlandz123/pen/oNoBbvN)


## v-bind

<font color=#AD3C86> **效果:** </font> 動態地綁定 HTML 屬性，將資料傳遞到元素上

### 動態屬性
* : 是 v-bind 的縮寫
* v-bind 可以使用各種 JS 的表達式
* 可以傳入 data 內的資料
* input 中可以使用 :value 動態屬性傳入 data 內的值或是任何 JS 表達式的結果
* :src 也同樣道理可傳入 data 內的網址來呈現圖片
* v-bind 可以操作任何 html 裡面的標籤
```=vue
<img v-bind:src="imageSrc">
<!-- 縮寫 -->
<img :src="imageSrc">
<img :src="'/path/to/images/' + fileName">
```
[v-bind 動態屬性](https://codepen.io/binlandz123/pen/yLPgeyq)

### v-bind 進行物件的樣式切換
利用 `v-bind` 來改變標籤的 CSS 樣式
* 使用物件或陣列的方式帶入 CSS ， EX: `:class="{ css className : 屬性(true、false)}"`

[v-bind 樣式切換](https://codepen.io/binlandz123/pen/XWVOyOX)
[參考](https://ithelp.ithome.com.tw/articles/10203646)
## v-is

<font color=#AD3C86> **效果:** </font> 可綁定元件，將元件內容顯示在一個區塊或標籤中
ps. 記得加入元件雙引號裡面要加上單引號
```=Vue
<div v-is="'元件名稱'"></div>
```
### 利用 v-is 跟 input v-model  達成元件動態切換
建立一個變數並用 v-model 綁定，並透過 input 輸入來切換元件名稱，再透過 v-is 來顯示不同元件的內容
[ v-is 動態切換範例](https://codepen.io/binlandz123/pen/zYpRONM?editors=1010)
### 在 table 加入 td 元件，卻顯示在 table 上方
由於原始 html 結構 tbody 裡面就是加入 tr ，雖然元件 template 也是加入 tr 但是寫進去的標籤還是元件名稱，所以渲染的時候還是會把元件寫在 table 外
#### 解決辦法
在 tbody 裡面 加入 tr 標籤，並利用 v-is 加入元件名稱，將元件內容顯示在 tr 
ps. 在此提醒元件名稱要加入單引號
[動態標籤實戰範例](https://codepen.io/binlandz123/pen/KKZQKPr?editors=1010)

## 參考
[v-if, v-else, v-else-if, v-show](https://hackmd.io/@hexschool/S1DJeKTdL/%2F9gbXrozPRm2By9AS9YNREg)
[v-for](https://hackmd.io/@hexschool/S1DJeKTdL/%2FKWXW13ewTaq2M_svlEAYXA)
[Vue.js: 列表渲染 v-for](https://cythilya.github.io/2017/04/27/vue-list-rendering/)
[v-bind](https://hackmd.io/@hexschool/S1DJeKTdL/%2FdxbCu6YTTh2q-Z0p1vWSjw)