]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(Transition): handle KeepAlive + transition leaving edge case
authordaiwei <daiwei521@126.com>
Wed, 2 Apr 2025 14:01:20 +0000 (22:01 +0800)
committerdaiwei <daiwei521@126.com>
Wed, 2 Apr 2025 14:01:20 +0000 (22:01 +0800)
packages/runtime-core/src/components/BaseTransition.ts
packages/runtime-core/src/renderer.ts

index 2b58bc3fc43dbe201624271f1312b51d45623a4d..f8755e7e76525b8624615939ee51ff101c8c3892 100644 (file)
@@ -24,7 +24,7 @@ import { SchedulerJobFlags } from '../scheduler'
 
 type Hook<T = () => 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<HostElement = RendererElement> {
index 05c4ac345eb81f9e030bc2078febc24c22f1dfe6..b0201952c06b5e037b6661be9fd0c075d436ebd0 100644 (file)
@@ -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<HostElement = RendererElement> {
   render: RootRenderFunction<HostElement>
@@ -2057,6 +2057,9 @@ function baseCreateRenderer(
           }
         }
         const performLeave = () => {
+          if (el!._isLeaving) {
+            el![leaveCbKey](true /* cancelled */)
+          }
           leave(el!, () => {
             remove()
             afterLeave && afterLeave()