]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(transition): handle edge case of cancel leave before next frame
authorEvan You <yyx990803@gmail.com>
Thu, 12 May 2022 07:39:34 +0000 (15:39 +0800)
committerEvan You <yyx990803@gmail.com>
Thu, 12 May 2022 07:39:34 +0000 (15:39 +0800)
fix #4462

packages/runtime-dom/src/components/Transition.ts

index 9e290ef2289169d20afba642f842bc1711c4ebe2..f33d413675503cd0c0d4216bb7ef2c67a884b02d 100644 (file)
@@ -174,7 +174,10 @@ export function resolveTransitionProps(
     done && done()
   }
 
+  let isLeaving = false
   const finishLeave = (el: Element, done?: () => void) => {
+    isLeaving = false
+    removeTransitionClass(el, leaveFromClass)
     removeTransitionClass(el, leaveToClass)
     removeTransitionClass(el, leaveActiveClass)
     done && done()
@@ -221,6 +224,7 @@ export function resolveTransitionProps(
     onEnter: makeEnterHook(false),
     onAppear: makeEnterHook(true),
     onLeave(el, done) {
+      isLeaving = true
       const resolve = () => finishLeave(el, done)
       addTransitionClass(el, leaveFromClass)
       if (__COMPAT__ && legacyClassEnabled) {
@@ -230,6 +234,10 @@ export function resolveTransitionProps(
       forceReflow()
       addTransitionClass(el, leaveActiveClass)
       nextFrame(() => {
+        if (!isLeaving) {
+          // cancelled
+          return
+        }
         removeTransitionClass(el, leaveFromClass)
         if (__COMPAT__ && legacyClassEnabled) {
           removeTransitionClass(el, legacyLeaveFromClass)