vue : watchcomputed以及对象数组

Posted foxcharon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue : watchcomputed以及对象数组相关的知识,希望对你有一定的参考价值。

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打进日志。

 

以上。

以上是关于vue : watchcomputed以及对象数组的主要内容,如果未能解决你的问题,请参考以下文章

vue中watch监听值或者form对象以及路由的变化

关于vue无法侦听数组及对象属性的变化的解决方案

vue--监听器

3.Vue对象遍历

Vue基础知识-基础使用

Vue watch和computed的区别