看同学一句话讲Vue双向绑定大致就是,Vue通过数据劫持和发布者-订阅者模式来实现双向绑定。
首先要介绍的是ES中的Object.defineProperty() 这东西有点东西。我们看看MDN上的demo 来源MDN它的作用有点类似Java中的反射机制,直接对对象的属性进行定义操作,例子中定义了对象object1的属性property1的值和是否可重写为false。由于可重写为false,之后再重新定义value为77的时候就失效了。
说回它对双向绑定的作用,个人理解在JS中,每个对象默认都包含有自己的getter和setter,也就是get和set方法,get是获取这个属性的时候会触发的方法,set是对这个属性进行设定的时候会触发的方法。而这两个方法可以被Object.defineProperty来进行重写,这样事情就好办了。对于MVVM中的 数据发生变化引发视图发生变化 这一步来说,我们可以重写数据发生变化时的set方法,然后在数据被修改的时候把修改的数据全部收集起来,通知各个应该被通知到的视图组件(每个对应的组件都有自己对应的Watcher,里面包含了修改对应视图的逻辑),我的数据发生了变化,你们该改变视图了。之后再调用相对应的回调函数或者是什么函数,修改对应的视图。就这个逻辑,数据就牵引着视图发生变化了。
而在Vue中,在初始化Vue对象的时候会对所有组件的data对象进行object.defineProperty进行重写,这一点让我有点想到设计模式中的代理模式,个人感觉有点像是静态代理或者是动态代理的感觉哈哈哈哈。在所有对象data属性上的get和set方法进行了修饰,来实现双向绑定。
目前具体的了解就这么多,欢迎大佬们指正。
网友评论