在前面我們有稍微提到了 v-for,現在來複習一下,一樣先建構 Vue 的基本結構和資料:
<script>
var app = new Vue({
el: '#app',
data: {
arrayData: [
{
name: '小明',
age: 16
},
{
name: '漂亮阿姨',
age: 24
},
{
name: '杰倫',
age: 20
}
],
objectData: {
ming: {
name: '小明',
age: 16
},
auntie: {
name: '漂亮阿姨',
age: 24
},
jay: {
name: '杰倫',
age: 20
}
},
filterArray: [],
filterText: ''
},
methods: {
reverseArray: function(){
this.arrayData.reverse();
},
filterData: function(){
var vm = this;
vm.filterArray = vm.arrayData.filter(function(item){
return item.name.match(vm.filterText);
});
},
cantWork: function(){
//this.arrayData.length = 0;
//this.arrayData[0] = {
// name: '小強',
// age: 99
//}
Vue.set(this.arrayData, 0,{
name: '小強',
age: 99
})
}
}
});
</script>
先來複習一下基本使用 v-for 的方法:
<ul>
<li v-for="(item, key) in arrayData">
{{ key }} - {{ item.name }} {{ item.age }} 歲
</li>
</ul>
這樣就會把 arrayData 內的每筆資料撈出來
接著如果我們的資料是帶有 input 元素時,就會產生一些問題,假設我們是要反轉陣列,先在 button 元素內新增點擊會反轉陣列的 function,我把這個 function 補在最上面的 script
<ul>
<li v-for="(item, key) in arrayData">
{{ key }} - {{ item.name }} {{ item.age }} 歲 <input type="text">
</li>
</ul>
<button class="btn btn-outline-primary" @click="reverseArray">反轉陣列</button>
這時候如果我們可以在 input 內輸入一點東西,會發現 input 內的資料並沒有辦法做反轉,僅只有 arrayData 的資料在做反轉,這部分會在後續做補充,Vue 的官方網站也有講解到,這時候我們要增加 key 屬性來讓 Vue 重新做渲染
這裡就先用 item.age 來做 key 屬性的值
<ul>
<li v-for="(item, key) in arrayData" :key="item.age">
{{ key }} - {{ item.name }} {{ item.age }} 歲 <input type="text">
</li>
</ul>
<button class="btn btn-outline-primary" @click="reverseArray">反轉陣列</button>
這時候 input 元素也會跟著做反轉了
假設我們現在要在 v-for 做過濾資料,要在欄位內輸入資料的名字,並把那筆資料撈出來:
分別先把定義好的資料 filterText 和 filterArray 綁上去 input 元素和 v-for 內
並在 input 元素內按下 Enter 鍵時,執行 filterData 這個 function
內容一樣補在最上方的 script
<input type="text" class="form-control" v-model="filterText" @keyup.enter="filterData">
<ul>
<li v-for="(item, key) in filterArray" :key="item.age">
{{ key }} - {{ item.name }} {{ item.age }} 歲 <input type="text">
</li>
</ul>
這裡值得一提的是運用了 .filter() 和 .match() 這兩個方法,可查詢相關文件
另外避免搞混,我們把 this 單獨宣告出來
這時候我們就可以過濾資料了
另外我們也可以輸出純數字的迴圈:
<ul>
<li v-for="item in 10">
{{ item }}
</li>
</ul>
如果我們是 in 一個數字就是繞出一個數字的迴圈
再來我們可以使用 <template> 搭配 v-for 來做使用,<template> 是不會做輸出的
而我們的目的是一次輸出兩個 <tr>:
<table class="table">
<template v-for="item in arrayData">
<tr>
<td>{{ item.age }}</td>
</tr>
<tr>
<td>{{ item.name }}</td>
</tr>
</template>
</table>
在 v-for 內,有時候我們會搭配 v-if 來做使用,撈出符合判斷式的資料:
<ul>
<li v-for="(item, key) in arrayData" v-if="item.age <= 20">
{{ key }} - {{ item.name }} {{ item.age }} 歲
</li>
</ul>
上面我們就新增了一個 v-if 並只顯示出年齡小於等於 20 歲的資料
另外在 Vue 裡面,有些狀況會無法運作,雖然是用 JS 的概念去寫,但仍然無法作用
我們一樣先把 arrayData 內的資料撈出來,並新增一個 cantWork 的 function 在 button 元素內function 內的內容一樣補在最上面的 script
<button class="btn btn-outline-primary" @click="cantWork">無法運行</button>
<ul>
<li v-for="(item, key) in arrayData" :key="item.age">
{{ key }} - {{ item.name }} {{ item.age }} 歲 <input type="text">
</li>
</ul>
第一種不能運作的情況是當我們把 arrayData 的長度改為 0 的時候,照理說資料就會被刪光,可是當我們點擊 button 元素時,資料並沒有不見
第二種不能運作的情況是當我們把 arrayData 內的某筆資料進行改寫時,也會無效,但是針對這種情況有另外一種做法,可以使用 Vue.set() 這個在官方文件中有提到,我們可以使用 Vue.set() 強制改寫某筆資料,上述我也改寫了第一筆資料
以上就是無法運作的情況