《浅析 Vue》—— computed 和 watch 的区别

111 阅读2分钟

computed——计算属性

computed就是用来计算出一个值的属性,换句话说被计算出来的属性就是计算属性。调用这个值时,不需要加括号,可以直接当属性用。

实例:

<div id="example">
  <p>Original message: "{{ message }}"</p>
  <p>Computed reversed message: "{{ reversedMessage }}"</p>
</div>

缓存

如果依赖的属性没有变化,那么计算属性就不会重新计算。Vue 对 getter/settr 做了特殊的处理,使这两个函数默认不会做存缓 。

computed特点

  1. 1.computed 最大的特点是会根据它们的响应式依赖进行自动缓存,如果依赖不变,那么 computed 的值就不会变。

  2. 2.computed 在使用时默认的 function 是 get函数,set 函数要自己加。

watch——侦听(监听)属性

watch 和 computed 有些相似,它的功能是当数据(属性)变化时,就执行一个函数。watch 在数据变化时执行异步或开销较大的操作时效率更高。

语法一

watch:{
    obj1:function(value,oldValue),      //function的参数是 Vue 传给我们的,一个最新值,一个旧值
  obj2(){},     //ES6缩写
  obj3:[f1,f2],     //两个函数,依次执行f1和f2
  obj4:'methodName',        //去methods里面找对应名字的函数
  obj5:{handler:fn,deep:true,immediate:true},function有些webpack版本可以省去
  obj6:'object.a':function(){}
}

语法二

vm.$watch('obj',fn,{deep:...,immediate:...})

watch 的 this

需要注意的是,watch 里面最好别用箭头函数,除非你放弃使用 this。

const vm = new Vue({
    data: ...
    watch:{
        n:function(){
            this ===vm
        }
    }
})

在这个代码中,箭头函数里 this 不等于 vm。首先,箭头函数本身也没有 this,其次 new Vue不是函数,而是函数的调用,这里的 this 是一个全局变量。

watch特点

immediate

根据 Vue 本身的逻辑,watch是监听属性,监听的是数据的变化,而第一次渲染的时候,是一个从无到有的过程,是一个开始,而不算变化。所以 Vue 默认第一次渲染的时候不执行watch。但 Vue 提供了 immediate 方法用于表示在第一次渲染的时候是否要执行 watch。

immediate:true/false        //true执行,false不执行,默认false

Deep

在 Vue 的数据中,复杂类型存地址,简单类型存数值。简单类型的数据如数字,改变了值就是直接改变了。但对于对象而言,地址没变,对象就没变。对象里面的属性变了,对象依旧不变。Vue 提供了 deep 方法用于判断是否要看这个对象里面的属性的变化。

Deep:true/false     //true就判断对象内的属性,默认flase

总结

Computed 主要着重于依赖之间的变化以及缓存,watch 主要是数据变化的时候去执行一个东西,而不是得出一个结构,比如记录历史或者打 log。