Vue源码之 Vue的生命周期

天地初开就是new Vue(options),里面就一句话 this._init(options); (Vue.prototype.init 的赋值在initMixin(Vue)方法里)vue

_init方法里:node

initInternalComponent 和mergeOptions方法是合并option这个另说。react

initEvents是处理父组件(若是有)传递来的on事件函数

initRender很重要,主要是这一句 vm._c = function (a, b, c, d) { return createElement(vm, a, b, c, d, false); }; 在vm实例上挂载一个_c方法,用处下面会讲到性能

initState很重要,处理咱们在一个组件里定义的参数,好比props,computed,watch,data等。刚开始是initProps,就是把父组件(若是有)传递进来的值从propsData中取出来,绑定给本身的对应的props里的属性,reactive以后再挂在vm上(至于为何父组件的属性能从本身的vm.$options.propsData中获取出来,这个下面会讲)。initMethods略,initData也简单,就是递归reactive,initComputed和initWatch别的文章另说。this

再往下,if (vm.$options.el) {vm.$mount(vm.$options.el);}prototype

这一段最重要,若是vue的参数里有el属性(el是准备挂载的节点,第一次的new Vue()的话是有的,后面的Vue组件没有,而是),进入$mount方法,点进去看只有一句return mountComponent(this, el, hydrating),可是这个方法后面被重写了,添加了一部分逻辑,添加的逻辑的做用是根据template(若是没有,根据el生成),生成render函数(里面调用上面_c),返回值是一个虚拟节点Vnode,递归

最后是mountComponent,新建一个render Watcher,expOrFn方法是vm._update(vm._render(), hydrating)(由于这个Watcher的lazy是false,因此会当即执行get方法,把本身推动栈顶,让被vm_render()引用到的属性收集依赖),事件

而接下来执行update方法,调用的是patch方法,把render生成的vnode和旧的对比,操做真实node,这个另说。get

上面说的是建立周期

建立以后,就到了update更新周期,set方法致使vm._update这个方法被调用,把render生成的vnode和旧的对比,操做真实node等等。

相关文章
相关标签/搜索