compute VS watch

107 阅读2分钟
vue 中的监听属性 watch 和计算属性 computed 都有监听的作用,但具体的适用场景和方法是有区别的

computed

computed 相当于定义一个变量(因此可知computed定义的变量都是新的变量,而不是props/data中的变量),这个变量接收其函数的返回值,函数里面的属性值经过计算返回给函数前面的变量,当函数里面的属性值发生变化时,就会触发这个函数进行计算,更新computed定义的变量,并将计算后的结果进行缓存,在函数里面的属性没有发生变化的情况下,都会调用缓存中的数据,减少开销。

computed不能进行异步操作,因为computed是通过return返回值传递参数,异步操作的时候return是没有意义的

适用环境:一个数据受到多个数据影响

举个栗子:

        title() {
            return this.date ? this.date + ' 计算属性 ' : ''
        }
    }

watch

watch更像是一个对象,键是需要观察的表达式,值是对应的回调函数。值也可以是方法名,或者包含选项的对象。vue实例化时调用$watch(),遍历watch对象的每一个property。

watch是浅层的,被侦听的属性,仅在变化时才会触发回调函数,而嵌套的属性(如对象中的属性)的变化不会触发,如果想侦听所有嵌套属性的变更,则需要深层侦听器(deep:true)。

注意:watch支持异步,没有缓存,它侦听的变量是props/data中已经定义的变量,更加侧重的是处理的函数

export default {
  watch: {
    someObject: {
      handler(newValue, oldValue) {
        // 注意:在嵌套的变更中,
        // 只要没有替换对象本身,
        // 那么这里的 `newValue` 和 `oldValue` 相同
      },
      deep: true
    }
  }
}
// 深层侦听,需要遍历被侦听对象的所有嵌套的属性,当遇到复杂度高的大型数据结构的时候,开销会很大。

适用环境:适用于一个数据影响多个数据

区别

  1. watch是侦听所监听的对象本身是否变化从而触发;computed是监听函数里面的属性是否变化从而触发。
  2. watch可以直接修改监听对象的值,computed不可以直接修改,只能通过修改函数里面的属性,通过计算才能修改对应的值。
  3. watch没有缓存但支持异步,computed有缓存但不支持异步

学习笔记,记录一下下