-
1、
initData
执行:通过getData
函数调用vm.$options.data
选项获取数据对象,并对传入类型做处理,对data
和method
传进来同名做警告。优先级关系:props
优先级 >methods
优先级 >data
优先级 -
2、调用
observe
函数将data
数据对象转换成响应式 -
3、
observe(data, true /* asRootData */)
对数据观测条件进行了要求,符合条件才会被监听 -
4、watch为何能监听
data
:依赖Object.defineProperty
函数,通过该函数为对象的每个属性设置一对 getter/setter 从而得知属性被读取和被设置,$watch(render,render)
执行,第一个render
执行,触发get
拦截器,收集依赖,第二个render
当依赖发生变化执行,并将变化应用到DOM
-
5、
Observer(value、dep 、 vmCount、walk 和 observeArray)
类接收一个参数,即数据对象,函数里,get
函数主要完成了两部分重要的工作,一个是返回正确的属性值,另一个是收集依赖。set
函数也要完成两个重要的事情,第一正确地为属性设置新值,第二是能够触发相应的依赖,再解决响应式数据不一致问题 -
6、 判断
vm.$options.render
是否为真,后面进入callHook(vm, 'beforeMount')
函数,updateComponent
函数把渲染函数生成的虚拟DOM
渲染成真正的DOM
,updateComponent
将作为Watcher
的第二个参数。Watcher
观察者实例将对updateComponent
函数求值,updateComponent
函数的执行会间接触发渲染函数(vm.$options.render
)的执行,从而触发数据属性的get
拦截器函数,从而将依赖(观察者)收集,当数据变化时将重新执行updateComponent
函数,这就完成了重新渲染 -
7、对观察者做重复性处理以避免重复,做
try
,catch
处理以清楚错误位置 -
8、当数据发生更新时,
queueWatcher
函数会将观察者放到一个队列中等待所有突变完成后统一执行更新(队列会做重复优化)
vue源码分析中的mvvm双向数据绑定模式
猜你喜欢
转载自blog.csdn.net/weixin_42204698/article/details/91494854
今日推荐
周排行