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
}
}
所以在 computed
或 watch
块中编写的代码将仅在响应数据更改时执行一次。
虽然saurabh的回答没有错,但我觉得并没有真正回答问题。
答案是:不,观察者不是 "cached" - 没有意义,因为观察者是有副作用的函数,但没有return 个值,不能用作属性。
因此,为观察者缓存任何内容既没有必要也不明智。
但是,是的,两者都仅在监视的数据发生变化时执行。
在 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
}
}
所以在 computed
或 watch
块中编写的代码将仅在响应数据更改时执行一次。
虽然saurabh的回答没有错,但我觉得并没有真正回答问题。
答案是:不,观察者不是 "cached" - 没有意义,因为观察者是有副作用的函数,但没有return 个值,不能用作属性。
因此,为观察者缓存任何内容既没有必要也不明智。
但是,是的,两者都仅在监视的数据发生变化时执行。