通过图带你深入了解通过图带你深入了解vue的响应式原理的响应式原理
前言前言
如果自己去实现数据驱动的模式,如何解决一下几个问题:
通过什么手段去知道我的数据变了?
通过什么东西去同步更新视图?
数据劫持数据劫持——obvserver
我们需要知道数据的获取和改变,数据劫持是最基础的手段。在Obeserver中,我们可以看到代码如下:
Object.defineProperty(obj, key, {
enumerable: true,
configurable: true,
get: function reactiveGetter () {
// ...
},
set: function reactiveSetter (newVal) {
// ...
}
})
通过Object.defineProperty这个方法,我们可以在数据发生改变或者获取的时候,插入一些自定义操作。同理,vue也是在这个方法中做依赖收集和派发
更新的。
绑定和更新视图绑定和更新视图——watcher
从初始化开始,我们渲染视图的时候,便会生成一个watcher,他是监视视图中参数变化以及更新视图的。代码如下:
// 在mount的生命钩子中
new Watcher(vm, updateComponent, noop, {
before () {
if (vm._isMounted && !vm._isDestroyed) {
callHook(vm, 'beforeUpdate')
}
}
}, true /* isRenderWatcher */)
当然,我们可以保留疑问:
watcher是怎么去更新视图的
数据又是怎么和watcher联动起来的
具体的绑定和更新的流程,我们到后续的依赖收集中讲解。
我们先来讲讲响应式系统中涉及到的设计模式。
发布订阅模式发布订阅模式
在发布订阅模式中,发布者和订阅者之间多了一个发布通道;一方面从发布者接收事件,另一方面向订阅者发布事件;订阅者需要从事件通道订阅事件
以此避免发布者和订阅者之间产生依赖关系
vue的响应式流程的响应式流程
vue的响应式系统借鉴了数据劫持和发布订阅模式。