接下來要來介紹 Vue
裡面的 computed(計算)& watch(監聽)
computed
的運用上,是我們要返回某個值且顯示到頁面上,會用到的
舉個例子,一樣先建構 Vue
的架構跟資料狀態:
<script>
var app = new Vue({
el: '#app',
data: {
arrayData: [
{
name: '小明',
age: 16
},
{
name: '漂亮阿姨',
age: 24
},
{
name: '杰倫',
age: 20
}
],
filterText: '',
trigger: false,
newDate: 0
}
});
</script>
我們一樣來過濾資料,但這次不採用點擊任何按鈕的方式,我們要在 input
欄位內輸入文字時,就可以把那筆資料撈出來:
<input type="text" class="form-control">
<ul>
<li v-for="(item, key) in arrayData" :key="item.age">
{{ key }} - {{ item.name }} {{ item.age }} 歲 <input type="text">
</li>
</ul>
正常這樣寫,我們就可以把每筆資料都顯示出來,但是為了要做到過濾功能,我們就可以使用 computed
功能來幫忙,
我們先在 input
元素上綁定先定義好的 filterText
資料,接著把 arrayData
換成 filterArray
,不同於前面的是,這次 filterArray
已經不是我們先定義好的變數了,我們要藉由 computed
來產生,完成之後會如下:
<input type="text" class="form-control" v-model="filterText">
<ul>
<li v-for="(item, key) in filterArray" :key="item.age">
{{ key }} - {{ item.name }} {{ item.age }} 歲 <input type="text">
</li>
</ul>
接著我們要在 Vue
裡面的 data
下方,增加一個 computed
,並把要呈現的 filterArray
寫成一個 function
接著我們會 return
我們要的值,而要 return
的值,就是符合 filterText
的文字的資料,這時候一樣可以用到 .filter()
和 .match()
如下:
var app = new Vue({
el: '#app',
data: {},
computed: {
filterArray: function(){
var vm = this;
return vm.arrayData.filter(function(item){
return item.name.match(vm.filterText);
});
}
}
});
這個時候就會發現,功能已經如我們預期的完成了
接下來是 watch
,watch
的運用上,是當我們監聽某個資料,當有變動時就會執行 function
一樣來個例子:
<div class="box" :class="{'rotate': trigger }"></div>
<button class="btn btn-outline-primary" @click="trigger = 'true'">Counter</button>
前面我們已經有先定義好 trigger
這個變數了,當我們點擊按鈕時,trigger
會變成 true
且 .box
會增加 .rotate
這個 class
而我們要監聽的就是 trigger
這個變數資料,我希望 3
秒之後,他的資料狀態回到 false
狀態
這時候在 Vue
裡面除了先前的 data
和 computed
之外,也需要增加一個 watch
了,而我們要監聽的就是 trigger
所以寫一個當 trigger
資料變動時要執行的 function
var app = new Vue({
el: '#app',
data: {},
computed: {},
watch: {
trigger: function(){
var vm = this;
setTimeout(function(){
vm.trigger = false
},3000);
}
}
});
這時候當我們第一次點擊按鈕時,trigger
的資料狀態會變為 true
而 3
秒之後就會變回去 false
了