From: daiwei Date: Wed, 2 Apr 2025 14:01:20 +0000 (+0800) Subject: fix(Transition): handle KeepAlive + transition leaving edge case X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=16deaafc2cfb4860b5c3432ace60381fd4f4eec3;p=thirdparty%2Fvuejs%2Fcore.git fix(Transition): handle KeepAlive + transition leaving edge case --- diff --git a/packages/runtime-core/src/components/BaseTransition.ts b/packages/runtime-core/src/components/BaseTransition.ts index 2b58bc3fc4..f8755e7e76 100644 --- a/packages/runtime-core/src/components/BaseTransition.ts +++ b/packages/runtime-core/src/components/BaseTransition.ts @@ -24,7 +24,7 @@ import { SchedulerJobFlags } from '../scheduler' type Hook void> = T | T[] -const leaveCbKey: unique symbol = Symbol('_leaveCb') +export const leaveCbKey: unique symbol = Symbol('_leaveCb') const enterCbKey: unique symbol = Symbol('_enterCb') export interface BaseTransitionProps { diff --git a/packages/runtime-core/src/renderer.ts b/packages/runtime-core/src/renderer.ts index 05c4ac345e..b0201952c0 100644 --- a/packages/runtime-core/src/renderer.ts +++ b/packages/runtime-core/src/renderer.ts @@ -85,7 +85,7 @@ import { initFeatureFlags } from './featureFlags' import { isAsyncWrapper } from './apiAsyncComponent' import { isCompatEnabled } from './compat/compatConfig' import { DeprecationTypes } from './compat/compatConfig' -import type { TransitionHooks } from './components/BaseTransition' +import { type TransitionHooks, leaveCbKey } from './components/BaseTransition' export interface Renderer { render: RootRenderFunction @@ -2057,6 +2057,9 @@ function baseCreateRenderer( } } const performLeave = () => { + if (el!._isLeaving) { + el![leaveCbKey](true /* cancelled */) + } leave(el!, () => { remove() afterLeave && afterLeave()