watch和computed的区别

366 阅读1分钟

watch和computed的区别

  • watch是监听一个变量变化,进行一系列的操作,支持异步操作,不缓存;
  • computed是监听计算属性用到的多个变量,任意一个发生变化时,重新计算该计算属性,不支持异步操作,能缓存;
  • 需要在数据变化时执行异步或开销较大的操作时,适合用watch;
  • watch有immideate和deep两个属性,支持加载时立即执行一个函数和深度监听对象内部的变化(监听数组不需要这样);

vm.$watch

  • 参数

    • {string | Function} expOrFn

    • {Function | Object} callback

    • {Object} [options]

      • {boolean} deep选项:deep

        为了发现对象内部值的变化,可以在选项参数中指定 deep: true

        监听数组的变更不需要这么做。

        vm.$watch('someObject', callback, {
          deep: true
        })
        vm.someObject.nestedValue = 123
        // callback is fired
        
      • {boolean} immediate选项:immediate

        在选项参数中指定 immediate: true 将立即以表达式的当前值触发回调:

        vm.$watch('a', callback, {
          immediate: true
        })
        // 立即以 `a` 的当前值触发回调
        

        带有 immediate 选项时,你不能在第一次回调时取消侦听给定的 property。

  • 返回值{Function} unwatch

  • 用法

    观察 Vue 实例上的一个表达式或者一个函数计算结果的变化。回调函数得到的参数为新值和旧值。表达式只接受简单的键路径。对于更复杂的表达式,用一个函数取代。

// 键路径
vm.$watch('a.b.c', function (newVal, oldVal) {
  // 做点什么
})
​
// 函数
vm.$watch(
  function () {
    // 表达式 `this.a + this.b` 每次得出一个不同的结果时
    // 处理函数都会被调用。
    // 这就像监听一个未被定义的计算属性
    return this.a + this.b
  },
  function (newVal, oldVal) {
    // 做点什么
  }
)

vm.$watch 返回一个取消观察函数,用来停止触发回调:

var unwatch = vm.$watch('a', cb)
// 之后取消观察
unwatch()

\