ustbhuangyi/vue-analysis

关于 vm.$vnode 书中的说法似乎有误。

njleonzhang opened this issue · 3 comments

  // 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.
不知道我理解的对不对。

你理解的不对呀,vm.$vnode 就是父占位节点的 VNode,它是一个组件 VNode。数据变化会执行 updateComponent 但是执行不到 mountComponent 这个逻辑

好的,我再学习下,这里总觉得怪怪的。那按这个说法岂不是只有根的Vue实例才能触发 mounted callback?一个项目只有一个最外层的 App.vue 触发 mounted?还是这里的根另有他指?

Vue 是支持多例的。比如 cube-ui 的 createAPI 模块就是动态实例化一个 Vue 实例。