diff --git a/packages/runtime-core/src/renderer.ts b/packages/runtime-core/src/renderer.ts index eece7c35..0b86923e 100644 --- a/packages/runtime-core/src/renderer.ts +++ b/packages/runtime-core/src/renderer.ts @@ -1573,10 +1573,14 @@ export function createRenderer< } function remove(vnode: HostVNode) { - const { type, el, anchor, children, transition } = vnode + const { type, el, anchor, transition } = vnode + if (type === Fragment) { + removeFragment(el!, anchor!) + return + } + const performRemove = () => { hostRemove(el!) - if (anchor != null) hostRemove(anchor) if ( transition != null && !transition.persisted && @@ -1585,11 +1589,7 @@ export function createRenderer< transition.afterLeave() } } - if (type === Fragment) { - performRemove() - removeChildren(children as HostVNode[]) - return - } + if ( vnode.shapeFlag & ShapeFlags.ELEMENT && transition != null && @@ -1607,10 +1607,16 @@ export function createRenderer< } } - function removeChildren(children: HostVNode[]) { - for (let i = 0; i < children.length; i++) { - remove(children[i]) + function removeFragment(cur: HostNode, end: HostNode) { + // For fragments, directly remove all contained DOM nodes. + // (fragment child nodes cannot have transition) + let next + while (cur !== end) { + next = hostNextSibling(cur)! + hostRemove(cur) + cur = next } + hostRemove(end) } function unmountComponent(