Skip to content

Commit e8aed9e

Browse files
committed
chore: delay unmount child suspense
1 parent f43bf6d commit e8aed9e

File tree

1 file changed

+29
-18
lines changed

1 file changed

+29
-18
lines changed

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

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,7 @@ export interface SuspenseBoundary {
408408
isInFallback: boolean
409409
isHydrating: boolean
410410
isUnmounted: boolean
411+
preEffects: Function[]
411412
effects: Function[]
412413
resolve(force?: boolean, sync?: boolean): void
413414
fallback(fallbackVNode: VNode): void
@@ -488,6 +489,7 @@ function createSuspenseBoundary(
488489
isInFallback: !isHydrating,
489490
isHydrating,
490491
isUnmounted: false,
492+
preEffects: [],
491493
effects: [],
492494

493495
resolve(resume = false, sync = false) {
@@ -508,6 +510,7 @@ function createSuspenseBoundary(
508510
activeBranch,
509511
pendingBranch,
510512
pendingId,
513+
preEffects,
511514
effects,
512515
parentComponent,
513516
container,
@@ -518,6 +521,10 @@ function createSuspenseBoundary(
518521
if (suspense.isHydrating) {
519522
suspense.isHydrating = false
520523
} else if (!resume) {
524+
if (preEffects) {
525+
preEffects.forEach(e => e())
526+
preEffects.length = 0
527+
}
521528
delayEnter =
522529
activeBranch &&
523530
pendingBranch!.transition &&
@@ -723,25 +730,29 @@ function createSuspenseBoundary(
723730
},
724731

725732
unmount(parentSuspense, doRemove) {
726-
if (parentSuspense && parentSuspense.deps > 0) {
727-
return
728-
}
729-
suspense.isUnmounted = true
730-
if (suspense.activeBranch) {
731-
unmount(
732-
suspense.activeBranch,
733-
parentComponent,
734-
parentSuspense,
735-
doRemove,
736-
)
733+
const performUnmount = () => {
734+
suspense.isUnmounted = true
735+
if (suspense.activeBranch) {
736+
unmount(
737+
suspense.activeBranch,
738+
parentComponent,
739+
parentSuspense,
740+
doRemove,
741+
)
742+
}
743+
if (suspense.pendingBranch) {
744+
unmount(
745+
suspense.pendingBranch,
746+
parentComponent,
747+
parentSuspense,
748+
doRemove,
749+
)
750+
}
737751
}
738-
if (suspense.pendingBranch) {
739-
unmount(
740-
suspense.pendingBranch,
741-
parentComponent,
742-
parentSuspense,
743-
doRemove,
744-
)
752+
if (parentSuspense && parentSuspense.deps > 0) {
753+
parentSuspense.preEffects.push(performUnmount)
754+
} else {
755+
performUnmount()
745756
}
746757
},
747758
}

0 commit comments

Comments
 (0)