Vue 监视属性是否像计算属性一样缓存?

Do Vue watched properties cache just like the computed properties?

在 Vue 文档中 it is mentioned 与使用常规方法相反,计算属性被巧妙地缓存:

In comparison, a method invocation will always run the function whenever a re-render happens. Why do we need caching? Imagine we have an expensive computed property...

我的问题是watched properties 是否也有类似计算属性的缓存? (包括 Vuex 观察,例如使用 vm.$store.watch...

watchers 的行为将与 computed 的行为相同,因为 computed 是使用 watchers 在内部实现的。当一个人定义一个 computed 属性 时,vue 在内部设置观察者在计算 属性 中使用的变量,请参阅下面的代码来自 source:

function makeComputedGetter (getter: Function, owner: Component): Function {
  const watcher = new Watcher(owner, getter, noop, {
    lazy: true
  })
  return function computedGetter () {
    if (watcher.dirty) {
      watcher.evaluate()
    }
    if (Dep.target) {
      watcher.depend()
    }
    return watcher.value
  }
}

所以在 computedwatch 块中编写的代码将仅在响应数据更改时执行一次。

虽然saurabh的回答没有错,但我觉得并没有真正回答问题。

答案是:不,观察者不是 "cached" - 没有意义,因为观察者是有副作用的函数,但没有return 个值,不能用作属性。

因此,为观察者缓存任何内容既没有必要也不明智。

但是,是的,两者都仅在监视的数据发生变化时执行。