为了了解vue生命周期,看了vue的源码,看的是https://cdn.jsdelivr.net/vue/...
有几个地方感觉和官网给的生命周期图示不太符合,请大家解惑
官网 vue生命周期
Q1:
以下代码 对比 生命周期中的 A
vm._self = vm;
initLifecycle(vm);
initEvents(vm);
callHook(vm, 'beforeCreate');
initState(vm);
callHook(vm, 'created');
initRender(vm);
我理解的observe data的阶段应该是在initState(vm),init Events的阶段是在initEvents(vm),那为什么源码的顺序不是以下
vm._self = vm;
initLifecycle(vm);
callHook(vm, 'beforeCreate');
initState(vm);
initEvents(vm);
callHook(vm, 'created');
initRender(vm);
Q2:
以下代码 对比 生命周期中的 B
function initRender (vm) {
vm.$vnode = null; // the placeholder node in parent tree
vm._vnode = null; // the root of the child tree
vm._staticTrees = null;
vm._renderContext = vm.$options._parentVnode && vm.$options._parentVnode.context;
vm.$slots = resolveSlots(vm.$options._renderChildren, vm._renderContext);
vm.$scopedSlots = {};
// bind the public createElement fn to this instance
// so that we get proper render context inside it.
vm.$createElement = bind$1(createElement, vm);
if (vm.$options.el) {
vm.$mount(vm.$options.el);
}
}
上面代码中只判断了options中有没有提供el选项,提供了就直接挂载上去,但是图示显示的是提供了el选项之后还要判断是否提供了template选项
Q1 确实并没有搞明白,可以直接去知乎开个问题问一下尤雨溪。
Q2 是因为你阅读的源码只包含 run-time only 的逻辑,也就是说不包含运行时模版编译的逻辑,自然没有判断 template 的相关代码,standalone 版本的代码中可以找到这部分逻辑。