Skip to content

Commit 69914a4

Browse files
committed
fix(transition): reflow before leave-active class after leave-from (vuejs#2593), while fixing (vuejs#10688)
1 parent 664d2e5 commit 69914a4

File tree

1 file changed

+21
-7
lines changed

1 file changed

+21
-7
lines changed

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

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,13 @@ export function resolveTransitionProps(
181181
onAppearCancelled = onEnterCancelled,
182182
} = baseProps
183183

184-
const finishEnter = (el: Element, isAppear: boolean, done?: () => void) => {
184+
const finishEnter = (
185+
el: Element & { _enterCancelled?: boolean },
186+
isAppear: boolean,
187+
done?: () => void,
188+
isCancelled?: boolean,
189+
) => {
190+
el._enterCancelled = isCancelled
185191
removeTransitionClass(el, isAppear ? appearToClass : enterToClass)
186192
removeTransitionClass(el, isAppear ? appearActiveClass : enterActiveClass)
187193
done && done()
@@ -240,7 +246,10 @@ export function resolveTransitionProps(
240246
},
241247
onEnter: makeEnterHook(false),
242248
onAppear: makeEnterHook(true),
243-
onLeave(el: Element & { _isLeaving?: boolean }, done) {
249+
onLeave(
250+
el: Element & { _isLeaving?: boolean; _enterCancelled?: boolean },
251+
done,
252+
) {
244253
el._isLeaving = true
245254
const resolve = () => finishLeave(el, done)
246255
addTransitionClass(el, leaveFromClass)
@@ -249,9 +258,14 @@ export function resolveTransitionProps(
249258
}
250259
// add *-leave-active class before reflow so in the case of a cancelled enter transition
251260
// the css will not get the final state (#10677)
252-
addTransitionClass(el, leaveActiveClass)
253-
// force reflow so *-leave-from classes immediately take effect (#2593)
254-
forceReflow()
261+
if (!el._enterCancelled) {
262+
forceReflow()
263+
addTransitionClass(el, leaveActiveClass)
264+
} else {
265+
addTransitionClass(el, leaveActiveClass)
266+
// force reflow so *-leave-from classes immediately take effect (#2593)
267+
forceReflow()
268+
}
255269
nextFrame(() => {
256270
if (!el._isLeaving) {
257271
// cancelled
@@ -269,11 +283,11 @@ export function resolveTransitionProps(
269283
callHook(onLeave, [el, resolve])
270284
},
271285
onEnterCancelled(el) {
272-
finishEnter(el, false)
286+
finishEnter(el, false, undefined, false)
273287
callHook(onEnterCancelled, [el])
274288
},
275289
onAppearCancelled(el) {
276-
finishEnter(el, true)
290+
finishEnter(el, true, undefined, false)
277291
callHook(onAppearCancelled, [el])
278292
},
279293
onLeaveCancelled(el) {

0 commit comments

Comments
 (0)