Skip to content

Commit 5e4df55

Browse files
committed
fix(suspense): defer clearing fallback vnode reference to should unmount active branch first
1 parent e9c676f commit 5e4df55

File tree

1 file changed

+11
-6
lines changed

1 file changed

+11
-6
lines changed

packages/runtime-core/src/components/Suspense.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import {
2020
type RendererInternals,
2121
type RendererNode,
2222
type SetupRenderEffectFn,
23+
queuePostRenderEffect,
2324
} from '../renderer'
2425
import { queuePostFlushCb } from '../scheduler'
2526
import { filterSingleRoot, updateHOCHostEl } from '../componentRenderUtils'
@@ -553,9 +554,11 @@ function createSuspenseBoundary(
553554
)
554555
queuePostFlushCb(effects)
555556
// clear el reference from fallback vnode to allow GC after transition
556-
if (isInFallback && vnode.ssFallback) {
557-
vnode.ssFallback.el = null
558-
}
557+
queuePostRenderEffect(() => {
558+
if (isInFallback && vnode.ssFallback) {
559+
vnode.ssFallback.el = null
560+
}
561+
}, suspense)
559562
}
560563
}
561564
}
@@ -577,9 +580,11 @@ function createSuspenseBoundary(
577580
unmount(activeBranch, parentComponent, suspense, true)
578581
// clear el reference from fallback vnode to allow GC
579582
// only clear immediately if there's no delayed transition
580-
if (!delayEnter && isInFallback && vnode.ssFallback) {
581-
vnode.ssFallback.el = null
582-
}
583+
queuePostRenderEffect(() => {
584+
if (!delayEnter && isInFallback && vnode.ssFallback) {
585+
vnode.ssFallback.el = null
586+
}
587+
}, suspense)
583588
}
584589
if (!delayEnter) {
585590
// move content from off-dom container to actual container

0 commit comments

Comments
 (0)