基本用法
/** watch */watch: {firstName: function (val) {this.fullName = val + ' ' + this.lastName},lastName: function (val) {this.fullName = this.firstName + ' ' + val}}/** computed */computed: {now: function () {return Date.now()}}
可以发现, watch 和 computed 的基本写法基本一致(抛去特殊的写法)。
都是以 key: function() { [code] } 为基本结构。
从功能上来说
watch 是监听一个值,并对其变化作出响应computed 是提供一个基于多个响应值的计算得出来的结果
从原理上来说
watch 和 computed 在 Vue 源码内实际上都是 Watcher 对象,其中主要的区别是初始化 Watcher 时提供的参数的区别。
expOrFn,expOrFn参数主要提供的是需要做依赖收集的表达式或者函数,表达式最终在Watcher构造函数内部最终还是会转换成函数,所以可以总结expOrFn提供的是需要做依赖收集的函数watch提供的expOrFn是一个key值参数,比如key1.key2.key3,最终在Watcher内部会被转换为function(context) { return context[key1][key2][key3] }computed提供的则是一个完整的函数
lazy,lazy参数的主要在于决定,是否在监听的值发生的变化后立即响应,并且是否会在初始化的时候就去收集依赖watch是默认值false,默认直接响应,并在初始化的时候就去收集依赖,计算结果。computed是手动传入的true,不会在监听的值发生变化后直接响应,只在需要获取当前值的时候再去计算依赖收集得到结果。
deep,deep参数主要决定是否深度的去收集依赖,会去递归的遍历expOrFn得到的结果,如果结果并不是响应式的数据,即便设置了deep也没有作用,所以仅对watch有作用watch是手动传入的true,在初始化或者更新数据后,会对结果进行深度遍历,从而会进行深度的依赖收集computed为默认值false
