V-for
用途:
將資料列表列渲染出來
簡介:
v-for 指令需要使用 item in items
形式來做撰寫
而v-for會因為後方items
接的是 物件
還是 陣列
而傳入不同對應內容
1.以陣列為例:
假設todos是一個陣列
<li v-for=“(Todo,8) in todos”>
Todo:回傳的是陣列中的屬性值
8 :回傳的是陣列中的索引值
小結論:
( )括號中的參數都可以自行命名,
但是第一個會回傳一定是陣列中屬性值,第二個才是索引值2.以物件為例:
範例:v-for=“(val, name, index) in object”
小結論:參數中名字都可以自行更換,但每個參數位置會回傳的值都是固定的
如:範例一定會先回傳物件中屬性值、接著才是屬性名稱、最後才是索引二、建議,基本上v-for參數撰寫,就是照著官網提供對應參數位置填寫即可
範例:v-for + index
1 | <div id="app"> |
範例:v-for + range
注意:
1.範圍n
只能是整數
2.range 索引 item
由 1 開始計算
1 | <ul> |
範例:過濾資料(filter)
1 | <p>請製作過濾資料</p> |
1 | filterArray: [], |
補充討問:
vm 使用情境? 討論連結
因為要使用 filter() 這個函式,所以將 vm = this , 如果沒有使用到處理陣列的函式( forEach, filter, map, find…),就可以直接用 this 了
範例:在Template上使用v-for
1 | <h4>Template 的運用</h4> |
補充:維護狀態
主要說明v-for
更新原理是使用就地更新
(in-place patch)方式,不會移動DOM元素(用下方例子說明就是input位置不變
),僅會更新arrayData陣列中的資料
若還不清楚,可以參考同學整理結果
問題:DOM元素內容不更換的話,會造成網頁渲染畫面出錯
改善方式:提供一個唯一key屬性
如下範例:
1 | <li v-for="(item, key) in arrayData" :key="item.age"> |
v-for與v-if一同使用
當它們處於同一節點,v-for的優先級比v-if更高
官網表示不推薦在同一元素是使用v-if
和v-for
原因
注意事項:
Vue不能監測下列情況的陣列
1.利用索引直接設置一個陣列 如:
1 | this.arrayData[0]={ |
2.修改陣列長度時 如:this.arrayData.length = 0;
該如何修正錯誤呢?
使用Vue.set
先附上參考資料
寫法:Vue.set( target, propertyName/index, value )
範例:javascript Vue.set(this.arrayData, 0, { name: '強尼', age: 8 }