vue源码分析中的mvvm双向数据绑定模式

  • 1、initData执行:通过getData函数调用vm.$options.data选项获取数据对象,并对传入类型做处理,对datamethod传进来同名做警告。优先级关系: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渲染成真正的DOMupdateComponent将作为Watcher的第二个参数。Watcher观察者实例将对 updateComponent函数求值,updateComponent 函数的执行会间接触发渲染函数(vm.$options.render)的执行,从而触发数据属性的 get拦截器函数,从而将依赖(观察者)收集,当数据变化时将重新执行 updateComponent函数,这就完成了重新渲染

  • 7、对观察者做重复性处理以避免重复,做trycatch处理以清楚错误位置

  • 8、当数据发生更新时,queueWatcher函数会将观察者放到一个队列中等待所有突变完成后统一执行更新(队列会做重复优化)

猜你喜欢

转载自blog.csdn.net/weixin_42204698/article/details/91494854