App中引入HelloWorld子组件, 在HelloWorld中$parent为什么指向了App, 而不是HelloWorld的占位符实例。是HelloWorld跳过了占位符vnode直接生成了渲染vnode么
// core/instance/lifecycle.js
export function initLifecycle (vm: Component) {
const options = vm.$options
let parent = options.parent
vm.$parent = parent
}
new Vue({render: h => h(App)}).$mount('#app')
vm是new Vueinit
-> initLifecycle() {vm.$parent = parent}
vm.parent是undefinedrender
(生成占位符vnode)update(vnode/*占位节点*/, hydrating)
, 设置activeInstance
为vmpatch (oldVnode /*div #app*/, vnode /*占位符vnode*/, hydrating, removeOnly)
-createComponent(vnode, insertedVnodeQueue, parentElm, refElm)
, 调用init
, 生成componentInstance
child
, vm.parent是上次激活的Vue实例, 接着走_init
和$mount
。是否代表组件渲染成真实的dom, 需要走俩次mount,一次是挂载占位节点,一次是挂载渲染节点
在我设想中, 应该有4次mount即4次_update:App的占位节点和渲染节点以及HelloWorld的占位节点和渲染节点。debbuger时只调用了3次mount。我猜测是只有createComponentInstance才会走mount, 一次初始化+2次createComponentInstance故而三次, 占位节点不会走mount。但是这样的话$parent也还是HelloWorld的占位节点呀。我看断点好像是HelloWorld跳过了占位节点,直接生成了渲染节点