在Vue.js阵中的变化检测
我最近的重组,公司现有业务代码与Vue.js的尝试,基于组件的设计思想和理念有MVVM使我着迷。但这是一个很大的坑,如数组后,结合本文介绍的更新测试。
相信大家都知道,观察员,观察员和VM是Vue公司的最重要的组成部分,它是检测后的数据改变视图的更新重要。用法的例子看vue.js美元,我们讨论了如何落实基本表。
接下来,让我们看看如何实现数组更改检测。
例子:
创建虚拟机
让VM =新的Vue({
数据:{
答:{ },{ },}
}
})
关键字/键路径
虚拟机。$看('a',函数(){(){
/做什么
})
思维
在js中,实现钩子很容易,例如:
一个控制台。
让_log = console.log
console.log =功能(数据){
做 / /东西
_log.call(这个数据)
}
只要我们实现了一个自定义函数,就可以观察数组的变化。
在Vue.js,object.create()的功能是用来进行传承,从而实现自定义功能观察数组。
/简要介绍
var =新的(对象);创建对象,而不是父类
var b = object.create(a.prototype); / / B继承原型
继承
Array.js的定义如下:
获取/原型
const arrayproto = array.prototype
创建一个新的原型对象
出口arraymethods = const object.create(arrayproto)
为了实现这些功能,/新的原型
{
推,
流行音乐,
转移,
位置,
拼接,
排序,
反向
}
。foreach(函数(方法){)
获取一个新的原型函数(未定义未实现)
const原= arrayproto {方法}
添加新功能/原型
object.defineproperty(arraymethods,方法,{)
价值:功能突变体(){
让我为arguments.length
获取参数
const参数=新的数组(我)
当(i){
args {我} =论点{我}
}
函数
const的结果= original.apply(这,args)
获取/观察员
这__ob__ OB = const。
要更改数组本身吗。
让插入
开关(方法){
case'push:
插入=参数
打破
case'unshift:
插入=参数
打破
case'splice:
插入= args.slice(2)
打破
}
新阵列{观测}
ob.observearray插入(插入)
更新
Ob.dep.notify()
返回结果
},
枚举:真,
可写的:真的,
配置:真
})
})
好的,我们已经定义了array.js,和作为一个模块的出口,我们修改了观测器的实现:
导出函数观察器(值){
this.dep =新的DEP()
this.value =价值
如果数组为,则将原型更改为
如果(Array.isArray(值)){
__proto__ = arraymethods价值。
This.observeArray(值)
{人}
this.walk(价值)
}
}
数据元素
observer.prototype.observearray =功能(项目){
为了(让我= 0,L = items.length;i < L;i++){
观察(项目{ })
}
}
当观察者被修改后,我们将再次观察观察者,只是为了改变它的更新功能。
watcher.prototype.update =功能(DEP){
console.log(2。更新)
const值= this.get()
const属性的旧值= this.value
this.value =价值
如果this.value价值(价值| |!= =!= NULL){
this.cb.call(this.vm、价值、属性的旧值)
如果没有这个函数,将导致多次调用$表回调函数。
原因是:观察到了变化数组和新数组,应该删除旧的观察者。
Dep.subs.shift()
}
}
结果uff1a
const VM =新的Vue({
数据:{
B:{ {:'a' },{ B B } }
}
})
虚拟机。$看(B(Val)= > {
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主要使用()函数。希望本文的内容会对大家的学习和工作带来一些帮助。如果有问题,你可以留言。