vm.$vnode 和 vm._vnode 问题

来源:3-3 patch(上)

Arey_jy

2018-11-05

vm.$vnode(_parentVnode) 意思就是未经过 _render 函数处理的 vnode, vm._vnode 是经过 render处理过的,为什么文章中说的它们是一种父子关系呢? vue 为什么要在2处进行引用 _parentVnode 呢?

我们只保留关键部分的代码,这里的 _parentVnode 就是当前组件的父 VNode,而 render 函数生成的 vnode 当前组件的渲染 vnode,vnode 的 parent 指向了 _parentVnode,也就是 vm.$vnode,它们是一种父子的关系。

写回答

3回答

ustbhuangyi

2018-11-05

举个例子,在父组件的 template 中有一个组件标签 <child></child>。
child 的模板比如说是 <div class=child>xxxx</div>。
那么在父组件中,child 就是一个组件 vnode,它会在 patch 过程中执行 child 组件的初始化,同时把这个 vnode 作为参数传入,子组件初始化的时候这个 vnode 就是_parentVnode,那么子组件经过 _render 渲染生成的 vnode 是 vm._vnode,_vnode 你可以理解为组件的渲染 root vnode,而 $vnode 就是 _parentVnode,是这个组件在父组件中的占位组件 vnode,所以说是父子关系也不为过。

3
3
ustbhuangyi
回复
qq_飞越疯人院_1
嗯,学习过程中可以自己去写几个小栗子,有助于理解
2019-04-30
共3条回复

qq_飞越疯人院_1

2019-05-05

_parentVnode首先赋值给了$vnode,然后又赋值给了vnode.parent。

在_update内vnode又赋值给了_vnode,所以$vnode就是_vnode的父辈了。

0
0

Arey_jy

提问者

2018-11-05

父子关系来 表达觉得有点不太恰当吧? 

0
0

Vue.js 源码深入解析 深入理解Vue实现原理

全方位讲解 Vue.js 源码,进阶高级工程师

4989 学习 · 1038 问题

查看课程