data
中除了之前所放入的屬性與資料內容外,也可以放入 JSON 的資料結構。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| var vm = new Vue({ el: "#app", data: { list: [ { name: "Min", age: 56, }, { name: "Tim", age: 55, }, { name: "Joshua", age: 20, }, ], }, });
|
v-for
這次要透過列表的方式將 JSON 資料呈現在網頁上,傳統 jQuery 可能要寫很多的 li
才能實現此畫面,透過 Vue 只要寫這樣:
1 2 3
| <ul> <li v-for="item in list">{{item.name}}</li> </ul>
|
說明:
透過 v-for
指令 ( 同等於 JS 的 for 迴圈篩選資料 ) 來取得資料,item 為自訂義的資料名稱,也就是指的是 data
中每一筆的物件資料,list 指的就是 JSON 本身,白話文可以解釋成:透過 v-for
從 list 篩選出每一筆的 item 資料內容,大括號指的是資料中的屬性。
加入索引 index
如果要加入索引,可以這樣寫:
1 2 3 4 5
| <ul> <li v-for="(item, index) in list" :key="index"> {{ index +1 }} - {{ item.name }} 是 {{item.age}} 歲 </li> </ul>
|
要記得索引是從 0 開始,如果要讓使用者從 1 開始,要設定成 index +1
。
CodePen:
其實現在編輯器相當人性,只要在 li
輸入 v-for
,按下 tab,就會跳出預設的格式,再修改成自己要的對應名稱即可。
v-if
簡單來說就是在 HTML 標籤中加入判斷式,以上方例子為例,倘若今天要判斷年紀超過 20 歲的人物顯示在網頁上。
1 2 3 4 5
| <ul> <li v-for="(item, index) in list" :key="index" v-if="item.age > 20"> {{ index +1 }} - {{ item.name }} 是 {{item.age}} 歲 </li> </ul>
|
補充觀念
官網不推薦同時使用 v-if
和 v-for
,原因是 v-for
的權重比較高。可看官網的指令說明與渲染列表說明,通常 v-if
會與 v-show
一起使用,這後面會提到。
v-for 列表渲染
在 li
建立 v-for
指令,讓 li
產生多個清單,再透過雙向綁定的方法,使得 HTML 的程式碼很乾淨。
1 2 3 4 5
| <ul id="ex1"> <li v-for="item in List"> {{item.msg}} </li> </ul>
|
item
為 List
中的清單資料,並且透過 data
中的 List
資料內容,同步到頁面上,這個列表不管是 HTML 或是資料的程式碼都乾淨且不會搞混。
1 2 3 4 5 6 7 8 9 10 11 12 13
| var vm = new Vue({ el: "#ex1", data: { List: [ { msg: "Good", }, { msg: "Wonderful", }, ], }, });
|
Codepen https://codepen.io/hnzxewqw/pen/xxwRVaZ
實際範例:今日要查找公司的銷售員名單,並且有編號在前。
HTML
1 2 3 4 5 6 7 8 9 10
| <div id="app"> <ul> <li v-for="(s, index) in sales"> <h3>{{ index }} {{ s.name }}: </h3> <div>age: {{ s.age }}</div> <div>company: {{ s.company }}</div> <div>email: {{ s.email }}</div> </li> </ul> </div>
|
JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| var vm = new Vue({ el: "#app", data: { sales: [ { age: 26, name: "Sarah Zamora", company: "ZINCA", email: "sarah_zamora@zinca.ca", }, { age: 37, name: "Cameron Wilder", company: "NIKUDA", email: "cameron_wilder@nikuda.biz", }, { age: 40, name: "Roach Hubbard", company: "EMOLTRA", email: "roach_hubbard@emoltra.me", }, { age: 38, name: "Juliet Sykes", company: "PROWASTE", email: "juliet_sykes@prowaste.org", }, { age: 21, name: "Jerri Jimenez", company: "ACCUPHARM", email: "jerri_jimenez@accupharm.tv", }, ], }, });
|
Codepen https://codepen.io/hnzxewqw/pen/VwvmjKy
或是做有分頁的選單也很不錯,
HTML
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <div id="app">
<ul> <li class="pager"><a href="#"> < </a></li>
<li class="pager" v-for="n in 10"> <a href="#">{{ n }}</a> </li>
<li class="pager"><a href="#"> > </a></li> </ul>
</div>
|
Codepen https://codepen.io/hnzxewqw/pen/yLYVJEO
雖然 vue 裡面沒有寫東西,但因為要套用指令效果,所以在 script
中還是要寫入 vue。
v-for + key
加上 key 是考量到效能,在預設狀況下,Vue.js 會盡量重複使用已經渲染好的元素,若不設定 key,不會重新渲染,只會部分更新。故當元素更新時 ( 例如:改變順序 ) 有可識別唯一性的 key 可以確保列表有重新渲染。
HTML
1 2 3 4 5 6 7 8 9 10 11 12 13
| <div id="app"> <h1>filtered by age less then 40: </h1>
<ul> <li v-for="(s, index) in filteredSales" :key="s.name"> <h3>{{ index }} {{ s.name }}: </h3> <div>age: {{ s.age }}</div> <div>company: {{ s.company }}</div> <div>email: {{ s.email }}</div> </li> </ul>
</div>
|
JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| var vm = new Vue({ el: "#app", computed: { filteredSales() { return this.sales.filter((d) => d.age < 40); }, }, data: { search: "", sales: [ { age: 26, name: "Sarah Zamora", company: "ZINCA", email: "sarah_zamora@zinca.ca", }, { age: 37, name: "Cameron Wilder", company: "NIKUDA", email: "cameron_wilder@nikuda.biz", }, { age: 40, name: "Roach Hubbard", company: "EMOLTRA", email: "roach_hubbard@emoltra.me", }, { age: 38, name: "Juliet Sykes", company: "PROWASTE", email: "juliet_sykes@prowaste.org", }, { age: 21, name: "Jerri Jimenez", company: "ACCUPHARM", email: "jerri_jimenez@accupharm.tv", }, ], }, });
|
v-if / v-else & v-show
大部分 v-if
跟 v-show
會拿來一起使用或比較,兩者最大的差別是在對 DOM 元素的操作。
v-if
會依照條件決定是否將元件渲染在網頁上,並決定事件與資料的監聽是否要綁定至元件或直接銷毀元件。
透過 v-if
加入判斷,倘若條件相符,就顯示於網頁上。
HTML
1 2 3 4 5 6 7 8
| <div id="app">
<h1 v-if="option1">Yes</h1> <hr>
<h1 v-if="option2">Yes</h1> <h1 v-else>No</h1> </div>
|
JavaScript
1 2 3 4 5 6 7
| var vm = new Vue({ el: "#app", data: { cond1: 1 > 0, cond2: false, }, });
|
Codepen https://codepen.io/hnzxewqw/pen/gOaLwpV
v-show
則是一定會產出元件,但以條件來切換 CSS (display:block / none)
的顯示與否。若條件更動頻繁,則適合用此方法。
HTML
1 2 3 4 5 6 7
| <div id="app"> <h1 v-if="cond1">Yes</h1> <h1 v-else>No</h1> <hr> <h1 v-show="cond2">Yes</h1> <h1 v-show="!cond2">No</h1> </div>
|
JavaScript
1 2 3 4 5 6 7
| var vm = new Vue({ el: "#app", data: { cond1: false, cond2: true, }, });
|
Codepen https://codepen.io/hnzxewqw/pen/abvBmNG