浅析computed与watch

152 阅读2分钟

computed

computed是计算属性,如果某个属性需要计算得到结果,就可以放到computed中。

new Vue({
    computed:{
        fn(){}
    },
    template:`
      <div>{{fn}}</div>
      //无需加括号即可引用
      set(){},
      get(){}
    `
})

computed中也可以使用setter与getter

此外,如果某个值已经被计算过,那么会被存到cache中,当使用到同样的值时,不会重新进行计算。


watch/this.$watch

watch是监听(异步),即当依赖的数据变化时,执行回调。

因为是异步,所以如果某个数据需要watch执行之后在执行,就需要通过 this.nextTick() 将其也变成异步来执行。

此外,watch还有两个属性,分别是immediate 和 deep

前者表示是否监听从无到有的第一次变化

后者表示是否深入监听数据的变化

new Vue({
    data(){
        return { obj :  { a : '' } }
    },
    watch:{
        'xxx':{
            handler(){obj.a = 'a'},
            immediate:true
            //此时,obj.a 会被渲染到页面上,否则不会
        }
    }
})

deep语法同上。

不使用deep时

  • 如果obj:{a:'a'} 中的 a 发生了变化,

那么对于watch来说,obj没变,obj.a变了,

  • 如果给obj重新赋值,但是值还是{a:'a'},

那么对于watch来说,obj变化了,但是obj.a并没有变化

使用deep时

如果obj.a发生了变化,那么对于watch来说,obj也发生了变化。


computed与watch的区别

  • computed是计算属性,注重值的计算。

在使用时,不需要加括号,且会调用缓存,如果已经被计算过,那么不会被再次计算。

  • watch是监听,注重当依赖的数据变化时,进行回调。

watch有两个属性,分别是immediate和deep,

前者表示一个数据从无到有时是否继续渲染。

后者表示是否深入判断对象中的值,如果为true,那么对象中的一个属性(如obj.a)发生了变化,watch就会判断为整个对象都发送了变化(obj.b 不会被判断为变化)。

注意:computed与watch中不能使用箭头函数