From: edison Date: Wed, 5 Nov 2025 13:53:06 +0000 (+0800) Subject: fix(suspense): clear placeholder and fallback el after resolve to enable GC (#13928) X-Git-Tag: v3.5.23~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f411c6604c12c531883aa0d30b81a7f69092f8a6;p=thirdparty%2Fvuejs%2Fcore.git fix(suspense): clear placeholder and fallback el after resolve to enable GC (#13928) --- diff --git a/packages/runtime-core/src/components/Suspense.ts b/packages/runtime-core/src/components/Suspense.ts index 0109d77c3f..d14e96be3d 100644 --- a/packages/runtime-core/src/components/Suspense.ts +++ b/packages/runtime-core/src/components/Suspense.ts @@ -530,6 +530,7 @@ function createSuspenseBoundary( effects, parentComponent, container, + isInFallback, } = suspense // if there's a transition happening we need to wait it to finish. @@ -551,6 +552,10 @@ function createSuspenseBoundary( MoveType.ENTER, ) queuePostFlushCb(effects) + // clear el reference from fallback vnode to allow GC after transition + if (isInFallback && vnode.ssFallback) { + vnode.ssFallback.el = null + } } } } @@ -570,6 +575,11 @@ function createSuspenseBoundary( anchor = next(activeBranch) } unmount(activeBranch, parentComponent, suspense, true) + // clear el reference from fallback vnode to allow GC + // only clear immediately if there's no delayed transition + if (!delayEnter && isInFallback && vnode.ssFallback) { + vnode.ssFallback.el = null + } } if (!delayEnter) { // move content from off-dom container to actual container @@ -728,6 +738,8 @@ function createSuspenseBoundary( optimized, ) if (placeholder) { + // clean up placeholder reference + vnode.placeholder = null remove(placeholder) } updateHOCHostEl(instance, vnode.el)