computed 和 watch 的区别

106 阅读1分钟

computed: 计算属性

  1. 依赖其他属性计算值,
  2. computed 的值有缓存,
  3. 当计算值变化才会返回内容,
  4. 可以设置 getter 和 setter。

watch: 监听到值的变化就会执行回调,在回调中可以进行一些逻辑操作。

应用场景:computed与vuex结合,刷新视图

computed: 一般用在模板渲染中,某个值是依赖了其它的响应式对象甚至是计算属性计算而来;

watch: 侦听属性适用于观测某个值的变化去完成一段复杂的业务逻辑

computed: 计算属性原理

juejin.cn/post/696122…

  1. 对计算属性进行属性劫持 利用Object.defineProperty来对计算属性的get和set进行劫持 Object.defineProperty(target, key, sharedPropertyDefinition);

2.重写计算属性的get方法 来判断是否需要进行重新计算

function createComputedGetter(key) { ... }

3.Watcher 改造

实例化的时候如果是计算属性 不会去调用 get 方法访问值进行依赖收集

update 方法只是把计算 watcher 的 dirty 标识为 true 只有当下次访问到了计算属性的时候才会重新计算

新增 evaluate 方法专门用于计算属性重新计算

新增 depend 方法 让计算属性的依赖值收集外层 watcher--这个方法非常重要 我们接下来分析

  1. 外层 Watcher 的依赖收集 当计算属性重新计算之后就立马会出栈 那么外层的 watcher 就会成为新的 Dep.target 我们使用 watcher.depend 方法让计算属性依赖的值收集一遍外层的渲染 watcher 这样子当计算属性依赖的值改变了既可以重新计算又可以刷新视图