美元在Vue.js观看使用
GitHub的源代码
观察者,观察者,和VM是Vue公司的最重要的组成部分,其中检测视图更新的重要环节的数据变化后,让我们看看如何实现一个简单的为手表的功能,当然,也有很多使用Vue的优化,这不在本文讨论。
例子:
创建虚拟机
让VM =新的Vue({
数据:A
})
关键字/键路径
VM。美元('a.b.c看,函数(){(){
/做什么
})
首先,阐明在这个演示和Vue公司的关系:
在VM调用$表之后,首先调用观察函数来创建观察实例来观察数据,观察者创建DEP,DEP用于维护订阅服务器。然后创建观察者实例来提供更新功能。一旦数据被改变,回调函数逐层执行。
观察者和观察
递归调用函数创建的观察者,观察者的创造过程中,使用object.defineproperty()函数将得到一套功能,它创造的工程实例
导出函数观察(瓦尔){
如果(Val typeof val | |!!= = 'object){
返回
}
返回新观察者(瓦尔)
}
功能definereactive(obj,关键,Val){
新DEP()
var属性= object.getownpropertydescriptor(obj,关键)
是否允许更改
如果(财产property.configurable = false){
返回
}
获取设置好的定义函数
VaR吸气=财产property.get
VaR的二传=财产property.set
无功childob =观察(Val)
object.defineproperty(obj,关键,{)
枚举:真,
可配置:真实,
(get):{
VaR值=吸气getter.call(obj):Val
这是为了获得监视程序初始化,添加订阅服务器
如果(dep.target){
Dep.depend()
如果(childob){
ChildOb.dep.depend()
}
做 / /如果ISArray。一些…
}
返回值
},
设置:(newval)= > {
VaR值=吸气getter.call(obj):Val
如果(值= newval){
返回
}
如果(设置){
setter.call(obj,newval)
{人}
newval val =
}
childob =观察(newval)
Dep.notify()
}
})
}
你可能会奇怪,一个dep.target是什么# 128563;
答案是:观察者,让我们来看看下一步。
DEP
导出默认函数Dep(){
this.subs = { }
}
你是吗!~!
dep.target = null
添加订阅服务器
dep.prototype.addsub =功能(子){
This.subs.push(子)
}
添加
(dep.prototype.depend =功能){
Dep.target.addDep(本)
}
注意:更新的订阅服务器。
(Dep.prototype.notify = function) {
this.subs.foreach(子)= sub.update()
}
守望者
为了增加每个数据的订阅量,我们考虑的方式是数据的get函数,但是get函数将被多次调用。然后向Dep添加一个参数目标
出口默认功能监视器(VM,exporfn,CB){
this.cb = CB
this.vm = VM
this.exporfn = exporfn
this.value = this.get()
}
(watcher.prototype.get =功能){
这dep.target =
const值=本。VM。_data {这exporfn }。
目标 / /具有的功能definereactive功能实现在上面添加用户的价值。
dep.target = null
为了避免重复设置为null
返回值
}
Vue公司的实例
在Vue公司的情况做最重要的事情是初始化状态,添加的功能,等等。
/ / Vue的例子
出口的默认功能Vue(选项){
选项$ =选项
这_initstate()。
}
初始化状态
(VUE。原型。_initstate =功能){
Let data = this._data = this.$options.data
object.keys(数据),ForEach(关键=这。_proxy(关键))
观察(数据,这个)
}
监视功能,
Vue。原型。$看=功能(exporfn,FN,选项){
新观察家(这exporfn,FN)
}
总结
到目前为止,我们已经实现了一个简单的$看功能,Object.defineProperty()的功能是非常重要的,所以我们不支持此功能的浏览器,Vue公司不支持它。
以上是本文的全部内容,希望能对您有所帮助,希望大家多多支持。