- 1.9 watch选项合并
1.9 watch选项合并
在使用Vue进行开发时,我们有时需要自定义侦听器来响应数据的变化,当需要在数据变化时执行异步或者开销较大的操作时,watch往往是高效的。对于 watch 选项的合并处理,它类似于生命周期钩子,只要父选项有相同的观测字段,则和子的选项合并为数组,在监测字段改变时同时执行父类选项的监听代码。处理方式和生命钩子选项的区别在于,生命周期钩子选项必须是函数,而watch选项最终在合并的数组中可以是包含选项的对象,也可以是对应的回调函数,或者方法名。
strats.watch = function (parentVal,childVal,vm,key) {//火狐浏览器在Object的原型上拥有watch方法,这里对这一现象做了兼容// var nativeWatch = ({}).watch;if (parentVal === nativeWatch) { parentVal = undefined; }if (childVal === nativeWatch) { childVal = undefined; }// 没有子,则默认用父选项if (!childVal) { return Object.create(parentVal || null) }{// 保证watch选项是一个对象assertObjectType(key, childVal, vm);}// 没有父则直接用子选项if (!parentVal) { return childVal }var ret = {};extend(ret, parentVal);for (var key$1 in childVal) {var parent = ret[key$1];var child = childVal[key$1];// 父的选项先转换成数组if (parent && !Array.isArray(parent)) {parent = [parent];}ret[key$1] = parent? parent.concat(child): Array.isArray(child) ? child : [child];}return ret};
下面结合具体的例子看合并结果:
var Parent = Vue.extend({watch: {'test': function() {console.log('parent change')}}})var Child = Parent.extend({watch: {'test': {handler: function() {console.log('child change')}}},data() {return {test: 1}}})var vm = new Child().$mount('#app');vm.test = 2;// 输出结果parent changechild change
简单总结一下:对于watch选项的合并,最终和父类选项合并成数组,并且数组的选项成员,可以是回调函数,选项对象,或者函数名。
