Browse Source

transition: remove pending leave element on enter

Evan You 10 years ago
parent
commit
7318bf4586
1 changed files with 14 additions and 0 deletions
  1. 14 0
      src/platforms/web/runtime/modules/transition.js

+ 14 - 0
src/platforms/web/runtime/modules/transition.js

@@ -99,6 +99,13 @@ export function enter (vnode: VNodeWithData) {
     addTransitionClass(el, startClass)
     addTransitionClass(el, startClass)
     addTransitionClass(el, activeClass)
     addTransitionClass(el, activeClass)
     nextFrame(() => {
     nextFrame(() => {
+      // remove pending leave element
+      const pendingNode =
+        el.parentNode._pending &&
+        el.parentNode._pending[vnode.key]
+      if (pendingNode && pendingNode.tag === vnode.tag) {
+        pendingNode.elm._leaveCb()
+      }
       removeTransitionClass(el, startClass)
       removeTransitionClass(el, startClass)
       if (!cb.cancelled && !userWantsControl) {
       if (!cb.cancelled && !userWantsControl) {
         whenTransitionEnds(el, cb)
         whenTransitionEnds(el, cb)
@@ -138,6 +145,9 @@ export function leave (vnode: VNodeWithData, rm: Function) {
   const expectsCSS = css !== false
   const expectsCSS = css !== false
   const userWantsControl = leave && leave.length > 2
   const userWantsControl = leave && leave.length > 2
   const cb = el._leaveCb = once(() => {
   const cb = el._leaveCb = once(() => {
+    if (el.parentNode._pending) {
+      el.parentNode._pending[vnode.key] = null
+    }
     if (expectsCSS) {
     if (expectsCSS) {
       removeTransitionClass(el, leaveActiveClass)
       removeTransitionClass(el, leaveActiveClass)
     }
     }
@@ -165,6 +175,10 @@ export function leave (vnode: VNodeWithData, rm: Function) {
       addTransitionClass(el, leaveClass)
       addTransitionClass(el, leaveClass)
       addTransitionClass(el, leaveActiveClass)
       addTransitionClass(el, leaveActiveClass)
       nextFrame(() => {
       nextFrame(() => {
+        // record leaving element
+        if (!vnode.data.show) {
+          (el.parentNode._pending || (el.parentNode._pending = {}))[vnode.key] = vnode
+        }
         removeTransitionClass(el, leaveClass)
         removeTransitionClass(el, leaveClass)
         if (!cb.cancelled && !userWantsControl) {
         if (!cb.cancelled && !userWantsControl) {
           whenTransitionEnds(el, cb)
           whenTransitionEnds(el, cb)