patch 函数中关于 destroy old node 的逻辑问题

来源:2-8 update

hood

2019-03-31

请问黄老师,什么情况下下面这段代码会走到 else-if 这条分支逻辑里?能举个例子吗?

我的理解 parentElm 肯定能取到值啊,如果 oldVnode 是真实 DOM ,parentElm 就是 body,否则既然有传 oldVnode,那肯定是经过一次 patch 了,那么 oldVnode.elm 就应该有对应的元素吧,这样 parentElm 也不应该会取空啊,这里实在是不理解。

// destroy old node
if (isDef(parentElm)) {
  removeVnodes(parentElm, [oldVnode], 0, 0);
} else if (isDef(oldVnode.tag)) {
  invokeDestroyHook(oldVnode);
}
写回答

1回答

ustbhuangyi

2019-04-01

如果你的根节点没有挂载到 DOM 上,那么它的 parentElm 就是 null,这个可能在你实际项目中比较难遇到,毕竟你是要挂载到 DOM 上的,但 Vue 的单测中就经常会遇到,比如:
//img.mukewang.com/szimg/5ca17ca90001ac9b11840482.jpg
这个 el 压根就没挂载到 DOM 上,所以就会触发到这个 else if 逻辑

0
1
hood
谢谢老师
2019-04-01
共1条回复

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

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

4984 学习 · 1037 问题

查看课程