Skip to content

watch & computed

computed

计算属性本身就是一个watcher,vue 有三种watcher:渲染watcher、用户watcher、计算属性watcher。计算属性watcher依赖的数据变化时,会重新计算,如果计算结果变化了,就会通知渲染watcher重新渲染。

计算属性的缓存,计算属性watcher的dirty属性为true时,会重新计算,计算完后,dirty属性为false,下次再访问计算属性时,就不会重新计算了。

原理实现

watch

watch 是一个对象,key 是需要观察的数据,value 是回调函数,当 key 对应的数据变化时,会执行回调函数。

$watch

$watch 是实例方法,用来观察实例上的数据变化,它返回一个取消观察的函数,用来停止触发回调函数。

参数

  • deep: 深度观察,当被观察的数据是对象时,会递归观察对象内部的数据变化。
  • immediate: 立即触发回调函数,当 immediate 为 true 时,回调函数会在侦听开始之后被立即调用。

watch 和 computed 的区别

  • computed 是计算属性,依赖的数据变化时,会重新计算,计算结果变化时,会通知渲染watcher重新渲染。
  • watch 是观察数据,当数据变化时,执行回调函数。
  • computed 有缓存,只有当计算属性依赖的数据变化时,才会重新计算,否则会使用缓存的计算结果。
  • watch 没有缓存,当数据变化时,会立即执行回调函数。
  • computed 适合计算结果会被多次使用的场景。
  • watch 适合数据变化时,执行异步或开销较大的操作。
  • watch 也可以实现 computed 的功能,但是 computed 不能实现 watch 的功能。