前言
最近在尝试用Vue.js重构公司的现有业务代码,组件化的设计思路和MVVM的思想让我深深沉迷于其中。但是是踩到了不少坑,就比如这篇文章介绍的数组绑定后的更新检测。
相信大家都知道Observer
,Watcher
,vm
可谓 Vue 中比较重要的部分,检测数据变动后视图更新的重要环节。在 4037.htm">vue.js中$watch的用法示例 中,我们讨论了如何实现基本的 watch 。
接下来,我们来看看如何实现数组变动检测。
例子:
vm.$watch('a',function () {
// 做点什么
})
思路
在 js 中, 很容易实现 hook, 比如:
Vue.js 中使用Object.create()
这个函数来实现继承,从而实现自定义函数,以观测数组。
var b = Object.create(a.prototype); // b 继承了a的原型
继承
array.js定义如下:
ok, 我们定义完了 array.js,并作为模块导出,修改 Observer
的实现:
if (Array.isArray(value)) {
value.proto = arrayMethods
this.observeArray(value)
} else {
this.walk(value)
}
}
// 观测数据元素
Observer.prototype.observeArray = function (items) {
for (let i = 0,l = items.length; i < l; i++) {
observe(items[i])
}
}
Observer
修改完毕后,我们再看看 Watcher
, 只需要改动其 update
函数,
结果:
console.log('------我看到你们了-----')
})
vm.b.push({c: 'c'})
vm.b.pop({c: 'c'})
vm.b.push({c: 'c'})
// 结果:
// console.log('------我看到你们了-----')
// console.log('------我看到你们了-----')
// console.log('------我看到你们了-----')
总结
至此,我们已经实现对数组变动的检测。主要使用了Object.create()函数。希望这篇文章的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。