1. 程式人生 > >vue : watch、computed、以及物件陣列

vue : watch、computed、以及物件陣列

watch和computed是vue框架中很重要的特性。

那麼,他們是怎麼作用於物件陣列的?

今天我們就來探究一下。

 

上程式碼。

<template>
  <div class="hello">
    {{ msg }} 
    
    <div>
      <button @click="submit">plus</button>
    </div>
    
    <div>{{ testNum }}</div>
  </div>
</
template> <script> export default { name: 'abc', data () { return { msg: 'Welcome to Your Vue.js App', originNum:0, originObj:[ ] } }, computed: { testNum(){ console.log("computed") if (this.originObj.length
=== 0) { this.$set(this.originObj, 0, {number:0}) return this.originObj[0].number } let obj = this.originObj[0] obj.number = -obj.number this.$set(this.originObj, 0, obj) return this.originObj[0].number } }, watch:{ originObj:{ handler:
function (val, oldVal) { console.log("watch") }, deep:true } }, created(){ }, mounted(){ }, methods:{ submit(){ let obj = this.originObj[0] obj.number = 100 this.$set(this.originObj, 0, obj) } } }; </script> <style scoped> </style>

 

首先是初始化(進入這個頁面時)。

從日誌中可以看到,先呼叫了computed,再呼叫了watch。

看程式碼。資料繫結是綁定了computed:testNum,所以初始化時就會呼叫。

      if (this.originObj.length === 0) {
        this.$set(this.originObj, 0, {number:0})
        return this.originObj[0].number
      }   

因為初始的物件陣列originObj沒有物件,所以加了一個物件。watch監聽到originObj改變了,所以打了日誌。

    submit(){
      let obj = this.originObj[0]
      obj.number = 100
      this.$set(this.originObj, 0, obj)
    }

然後,我點選按鈕,觸發submit()方法。

 

再看日誌,分別觸發了watch computed watch。

submit()方法修改了this.originObj[0].number,this.originObj的watch加了deep:true,所以可以監聽到,watch打進日誌。

this.originObj改變了,所以觸發了computed:testNum(計算屬性computed有快取,只在值改變時觸發),computed打進日誌。

computed:testNum觸發的時候同時也修改了this.originObj,所以再次觸發watch,watch打進日誌。

 

以上。