没图片太单调,用啥图呢,思考片刻选择了这幅图
数据绑定的本质
实现数据绑定的本质就是Setter+change事件
,前者Setter用于在数据模型变化时更新UI,后者change事件,用于在UI变化时更新数据模型,来看个大某:
|
|
从上面的代码可以看出,在data.text的Setter方法中更改了UI元素label和input的值,这样在data.text被赋值时,就会同步更新UI元素;同样在change事件中,input的值改变会同步更新data.text。
Vue数据绑定
这里只聊聊如何实现当数据变化时更新页面,至于当UI内容变化如何更新数据,其实和上面的例子是一样的。那你肯定会问,难道数据变化时更新页面难道和上面的例子不一样吗?当然不一样,继续看(你不要凑字数好吗?好的)。
我先来说说原理,接下来再上代码。尤大在实现数据变化更新UI时用到了动态收集依赖Dep,下面让尤大来给我们解释解释:
|
|
以下是精简后的代码,我把其他细节全部去掉了,只留下真正的核心代码。
Dep(依赖)
dep是用来连接data与watcher的桥梁,每个data的属性都对应一个dep。
|
|
Watcher
当expOrFn执行时,收集dep,保存data属性变化时调的callback。
|
|
Observer
observer使得data是可观察的,为data的每个属性都添加了dep,这里你会见到期盼已久的用Object.defineProperty
定义的setter方法,在setter方法里通过dep.notify最终通知watcher执行回调方法。
|
|
到现在把关键的三个类看完了,来看看如何使用它们:
|
|
从上面的例子可以看出,在设置name时,触发了watcher的回调,而在设置sex时,没有触发。
总结
到现在已经把相关的细节说完了,虽然我的阐述不多,但是已经加上了必要的注释。vue的数据绑定看似逻辑复杂,使用了动态收集依赖的思想,它的好处就是,dep与watcher的关系不是一成不变的,在更新页面的时候,只有被访问属性的dep才会与当前watcher建立联系,只有这个属性才能出发watcher的回调函数。如有有问题欢迎留言。