关于 vm.$vnode 书中的说法似乎有误。
njleonzhang opened this issue · 3 comments
njleonzhang commented
// manually mounted instance, call mounted on self
// mounted is called for render-created child components in its inserted hook
if (vm.$vnode == null) {
vm._isMounted = true
callHook(vm, 'mounted')
}
这里注意 vm.$vnode 表示 Vue 实例的父虚拟 Node,所以它为 Null 则表示当前是根 Vue 的实例。
vm.$vnode 应该就是自己的vnode吧,mount的时候第一次调用 updateComponent
,此时 $vnode 是 null,要触发一下 mounted hook 的回调 。如果是数据变化导致的 mountComponent
,则$vnode 就不是 null 了,而是上一次render 的 vnode.
不知道我理解的对不对。
ustbhuangyi commented
你理解的不对呀,vm.$vnode
就是父占位节点的 VNode,它是一个组件 VNode。数据变化会执行 updateComponent
但是执行不到 mountComponent
这个逻辑
njleonzhang commented
好的,我再学习下,这里总觉得怪怪的。那按这个说法岂不是只有根的Vue实例才能触发 mounted callback?一个项目只有一个最外层的 App.vue 触发 mounted?还是这里的根另有他指?
ustbhuangyi commented
Vue 是支持多例的。比如 cube-ui 的 createAPI 模块就是动态实例化一个 Vue 实例。