上篇文章,咱们讲了vm._renderProxy相关的内容。主要是经过Proxy为咱们vm属性添加一些自定义的行为。今天咱们回到init方法中,为你们讲解initLifecycle。
initLifeCycle方法用来初始化一些生命周期相关的属性,以及为parent,child等属性赋值,来看源码。html
export function initLifecycle (vm: Component) { const options = vm.$options // locate first non-abstract parent let parent = options.parent if (parent && !options.abstract) { while (parent.$options.abstract && parent.$parent) { parent = parent.$parent } parent.$children.push(vm) } vm.$parent = parent vm.$root = parent ? parent.$root : vm vm.$children = [] vm.$refs = {} vm._watcher = null vm._inactive = null vm._directInactive = false vm._isMounted = false vm._isDestroyed = false vm._isBeingDestroyed = false }
一行一行分析vue
const options = vm.$options
把mergeOptions后的options赋值给options变量。react
// locate first non-abstract parent let parent = options.parent if (parent && !options.abstract) { while (parent.$options.abstract && parent.$parent) { parent = parent.$parent } parent.$children.push(vm) }
咱们注意到,vue做者对这段代码提供了一行注释api
locate first non-abstract parent
定位第一个"非抽象"的父组件,注意非抽象这三个字。什么是非抽象呢?最初本身也很疑惑,最后在vue文档中找到了答案。数组
抽象组件的定义如上图所示,注意这句话,不会出如今父组件链中。明白了这点咱们再去看上面的代码就不会有那么迷糊了。ide
let parent = options.parent if (parent && !options.abstract) { ... }
当前vm实例有父实例parent,则赋值给parent变量。若是父实例存在,且该实例不是抽象组件。则执行下面代码ui
while (parent.$options.abstract && parent.$parent) { parent = parent.$parent } parent.$children.push(vm)
注意while循环内的条件parent.$options.abstract && parent.$parent
,若是父实例parent是抽象组件,则继续找parent上的parent。直到找到非抽象组件为止。以后把当前vm实例push到定位的第一个非抽象parent的$children属性上。这样咱们就说完了怎么找vm的parent属性。
以后咱们回到initLifecycle继续往下看this
vm.$parent = parent vm.$root = parent ? parent.$root : vm vm.$children = [] vm.$refs = {} vm._watcher = null vm._inactive = null vm._directInactive = false vm._isMounted = false vm._isDestroyed = false vm._isBeingDestroyed = false
这些代码都是为vm一些属性赋值。这些属性的做用以下表。spa
名称 | 说明 |
---|---|
$parent | 指定已建立的实例之父实例,在二者之间创建父子关系。子实例能够用 this.$parent 访问父实例,子实例被推入父实例的 $children 数组中。 |
$root | 当前组件树的根 Vue 实例。若是当前实例没有父实例,此实例将会是其本身。 |
$children | 当前实例的直接子组件。须要注意 $children 并不保证顺序,也不是响应式的。 |
$refs | 一个对象,持有已注册过 ref 的全部子组件。 |
_watcher | 组件实例相应的 watcher 实例对象。 |
_inactive | 表示keep-alive中组件状态,如被激活,该值为false,反之为true。 |
_directInactive | 也是表示keep-alive中组件状态的属性。 |
_isMounted | 当前实例是否完成挂载(对应生命周期图示中的mounted)。 |
_isDestroyed | 当前实例是否已经被销毁(对应生命周期图示中的destroyed)。 |
_isBeingDestroyed | 当前实例是否正在被销毁,尚未销毁完成(介于生命周期图示中deforeDestroy和destroyed之间)。 |
initLifecycle方法的逻辑比较简单,主要对vue实例一些属性进行赋值。因此这里就不画流程图来进行说明了。下篇文章咱们主要讲initEvents方法,敬请期待。code