diff --git a/packages/runtime-core/src/components/Suspense.ts b/packages/runtime-core/src/components/Suspense.ts index d5d544469f3..57ba92c6fcd 100644 --- a/packages/runtime-core/src/components/Suspense.ts +++ b/packages/runtime-core/src/components/Suspense.ts @@ -551,6 +551,8 @@ function createSuspenseBoundary( if (delayEnter) { activeBranch!.transition!.afterLeave = mountFallback } + suspense.isInFallback = true + // unmount current active branch unmount( activeBranch!, @@ -559,7 +561,6 @@ function createSuspenseBoundary( true // shouldRemove ) - suspense.isInFallback = true if (!delayEnter) { mountFallback() } diff --git a/packages/vue/__tests__/Transition.spec.ts b/packages/vue/__tests__/Transition.spec.ts index eb56c4fd39b..1465f9c9ece 100644 --- a/packages/vue/__tests__/Transition.spec.ts +++ b/packages/vue/__tests__/Transition.spec.ts @@ -1325,6 +1325,69 @@ describe('e2e: Transition', () => { }, E2E_TIMEOUT ) + + // #3963 + test( + 'Suspense fallback should work with transition', + async () => { + await page().evaluate(() => { + const { createApp, shallowRef, h } = (window as any).Vue + + const One = { + template: `