From 2e9726e6a219d546cd28e4ed42be64719708f047 Mon Sep 17 00:00:00 2001 From: Evan You Date: Mon, 13 Jan 2020 17:31:00 -0500 Subject: [PATCH] fix(runtime-core/renderer): fix v-if toggle inside blocks Should check both branches for parent container access. Fix #604. Close #607. --- packages/runtime-core/src/renderer.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/packages/runtime-core/src/renderer.ts b/packages/runtime-core/src/renderer.ts index 69056ccd..99c0ac08 100644 --- a/packages/runtime-core/src/renderer.ts +++ b/packages/runtime-core/src/renderer.ts @@ -595,20 +595,22 @@ export function createRenderer< ) { for (let i = 0; i < newChildren.length; i++) { const oldVNode = oldChildren[i] + const newVNode = newChildren[i] // 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 = + // - In the case of a Fragment, we need to provide the actual parent + // of the Fragment itself so it can move its children. oldVNode.type === Fragment || + // - In the case of Comment nodes, this is likely a v-if toggle, which + // also needs the correct parent container. oldVNode.type === Comment || + newVNode.type === Comment || + // - In the case of a component, it could contain anything. oldVNode.shapeFlag & ShapeFlags.COMPONENT ? hostParentNode(oldVNode.el!)! - : fallbackContainer + : // In other cases, the parent container is not actually used so we + // just pass the block element here to avoid a DOM parentNode call. + fallbackContainer patch( oldVNode, newChildren[i],