From 9f52dce0d58f5bc09dded9291eadbb6b1af2dcbe Mon Sep 17 00:00:00 2001 From: Evan You Date: Wed, 18 Dec 2019 17:09:28 -0500 Subject: [PATCH] fix(renderer): should also use latest parent node when patching block child components --- packages/runtime-core/src/renderer.ts | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/packages/runtime-core/src/renderer.ts b/packages/runtime-core/src/renderer.ts index 133a21c246..9fc0ebb681 100644 --- a/packages/runtime-core/src/renderer.ts +++ b/packages/runtime-core/src/renderer.ts @@ -594,21 +594,24 @@ export function createRenderer< ) { for (let i = 0; i < newChildren.length; i++) { const oldVNode = oldChildren[i] - if (!oldVNode) { - debugger - } + // Determine the container (parent element) for the patch. + // - In the case of a Fragment, we need to provide the actual parent + // of the Fragment itself so it can move its children. + // - In the case of a Comment, this is likely a v-if toggle, which also + // needs the correct parent container. + // - In the case of a component, it could contain anything. + // In other cases, the parent container is not actually used so we just + // pass the block element here to avoid a DOM parentNode call. + const container = + oldVNode.type === Fragment || + oldVNode.type === Comment || + oldVNode.shapeFlag & ShapeFlags.COMPONENT + ? hostParentNode(oldVNode.el!)! + : fallbackContainer patch( oldVNode, newChildren[i], - // - In the case of a Fragment, we need to provide the actual parent - // of the Fragment itself so it can move its children. - // - In the case of a Comment, this is likely a v-if toggle, which also - // needs the correct parent container. - // In other cases, the parent container is not actually used so we just - // pass the block element here to avoid a DOM parentNode call. - oldVNode.type === Fragment || oldVNode.type === Comment - ? hostParentNode(oldVNode.el!)! - : fallbackContainer, + container, null, parentComponent, parentSuspense, -- 2.47.3