在介绍内部原理前,先简单回顾一下它的用法:
1. 用法:
vm.$watch(expOrFn, callback, [options])
参数分析:
- {String| Function} expOrFn
- {Function | Object} callback
- {Object} [options] =>①{boolean} deep ②{boolean} immediate
返回值:{Function} unwatch
用法:用于观察一个表达式或computed函数在vue.js实例上的变化。回调函数调用时,会从参数得到新数据(new value)和旧数据(old value)。表达式只接受以点分割的路径,例如:a.b.c,如果是一个复杂的表达式,可以用函数代替。
例如:
vm.watch('a.b.c', function(newVal, oldVal){}
vm.$watch
返回一个取消观察函数,用来停止触发回调。
var unwatch = vm.$watch('a', (newVal, oldVal)=>{}) //之后调用取消观察:unwatch();
最后,简要介绍一下[option]的俩个选项deep和immediate
deep:为了发现对象内部值的变化,可以在选项参数中指定deep:true
vm.$watch('someObject', callback, { deep: true});
vm.someObject.nestedValue = 123;
immediate:在选项参数中指定immediate:true,将立即以表达式的当前值触发回调。
vm.$watch('a',callback, {immediate: true})//立即以'a'的当前值触发回调
2. vm.$watch的内部原理:
vm. $watch
其实是对watcher的一种封装,通过watcher完全可以实现vm.$watch的功能。
什么是watcher?
Watcher是一个中介的角色