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, 生成componentInstancechild, vm.parent是上次激活的Vue实例, 接着走_init和$mount。是否代表组件渲染成真实的dom, 需要走俩次mount,一次是挂载占位节点,一次是挂载渲染节点
在我设想中, 应该有4次mount即4次_update:App的占位节点和渲染节点以及HelloWorld的占位节点和渲染节点。debbuger时只调用了3次mount。我猜测是只有createComponentInstance才会走mount, 一次初始化+2次createComponentInstance故而三次, 占位节点不会走mount。但是这样的话$parent也还是HelloWorld的占位节点呀。我看断点好像是HelloWorld跳过了占位节点,直接生成了渲染节点