vue实现数据控制视图的原理解析实现数据控制视图的原理解析
这篇主要讲的就是vue很重要的一块知识点,双向数据绑定是如何实现的。一开始看这一块的内容的时候比较迷茫,迷茫在以
下几个点:
这块内容该从哪边入手
数据变化是如何驱动视图层更新的
做题深化知识点
从哪边着手去看响应式原理从哪边着手去看响应式原理
我这边提供三个方向,从这三个方向,你都可以看到watcher的使用,然后watcher的使用过程中,会掺杂到observer以及
dep,然后以点带面,对整体进行梳理
初始化的render流程去看
在lifecycle这个文件中的mountComponent这个方法里,创建了一个watcher。代码如下:
new Watcher(vm, updateComponent, noop, {
before () {
if (vm._isMounted && !vm._isDestroyed) {
callHook(vm, 'beforeUpdate')
}
}
}, true /* isRenderWatcher */)
可以透过这个传参,梳理出整一个
从watch的角度去看
从computed的角度去看
数据变化是如何驱动视图层更新的数据变化是如何驱动视图层更新的
这个问题其实可以分两个方面去看:
如何知道数据变化了如何知道数据变化了
如何知道某一块视图和数据有关,并更新他 如何知道数据变化了
答案:数据劫持
数据劫持的两种方式
Object.defineProperty
proxy
Vue3.0中的数据劫持是用proxy来实现的,目前阅读的源码中,都是以 Object.defineProperty 这种方式来实现的。
如何知道某一块视图和数据有关,并更新他如何知道某一块视图和数据有关,并更新他
答案:依赖收集以及订阅更新
详细解读过程:用图告诉你响应式原理
这里仅用一个简单的例子和图,来明确一下整个流程
<div id="app">
{{ message }}
{{ message1 }}
<input type="text" v-model="message">
<div @click="changeMessage">改变message</div>
</div>
var app = new Vue({
el: '#app',
data: {
message: '1',
message1: '2',
},
methods: {
changeMessage() {