基本用法

  1. /** watch */
  2. watch: {
  3. firstName: function (val) {
  4. this.fullName = val + ' ' + this.lastName
  5. },
  6. lastName: function (val) {
  7. this.fullName = this.firstName + ' ' + val
  8. }
  9. }
  10. /** computed */
  11. computed: {
  12. now: function () {
  13. return Date.now()
  14. }
  15. }

可以发现, watchcomputed 的基本写法基本一致(抛去特殊的写法)。
都是以 key: function() { [code] } 为基本结构。

从功能上来说

watch 是监听一个值,并对其变化作出响应
computed 是提供一个基于多个响应值的计算得出来的结果

从原理上来说

watchcomputed 在 Vue 源码内实际上都是 Watcher 对象,其中主要的区别是初始化 Watcher 时提供的参数的区别。

  1. expOrFnexpOrFn 参数主要提供的是需要做依赖收集的表达式或者函数,表达式最终在 Watcher 构造函数内部最终还是会转换成函数,所以可以总结 expOrFn 提供的是需要做依赖收集的函数

    1. watch 提供的 expOrFn 是一个 key 值参数,比如 key1.key2.key3 ,最终在 Watcher 内部会被转换为 function(context) { return context[key1][key2][key3] }
    2. computed 提供的则是一个完整的函数
  2. lazylazy 参数的主要在于决定,是否在监听的值发生的变化后立即响应,并且是否会在初始化的时候就去收集依赖

    1. watch 是默认值 false ,默认直接响应,并在初始化的时候就去收集依赖,计算结果。
    2. computed 是手动传入的 true,不会在监听的值发生变化后直接响应,只在需要获取当前值的时候再去计算依赖收集得到结果。
  3. deepdeep 参数主要决定是否深度的去收集依赖,会去递归的遍历 expOrFn 得到的结果,如果结果并不是响应式的数据,即便设置了 deep 也没有作用,所以仅对 watch 有作用

    1. watch 是手动传入的 true ,在初始化或者更新数据后,会对结果进行深度遍历,从而会进行深度的依赖收集
    2. computed 为默认值 false

参考