Skip to content

Commit 9fc42cf

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

File tree

1 file changed

+22
-7
lines changed

1 file changed

+22
-7
lines changed

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

+22-7
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 = true
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,15 @@ 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+
// force reflow so *-leave-from classes immediately take effect (#2593)
263+
forceReflow()
264+
addTransitionClass(el, leaveActiveClass)
265+
} else {
266+
addTransitionClass(el, leaveActiveClass)
267+
// force reflow so *-leave-from classes immediately take effect (#2593)
268+
forceReflow()
269+
}
255270
nextFrame(() => {
256271
if (!el._isLeaving) {
257272
// cancelled
@@ -269,11 +284,11 @@ export function resolveTransitionProps(
269284
callHook(onLeave, [el, resolve])
270285
},
271286
onEnterCancelled(el) {
272-
finishEnter(el, false)
287+
finishEnter(el, false, undefined, false)
273288
callHook(onEnterCancelled, [el])
274289
},
275290
onAppearCancelled(el) {
276-
finishEnter(el, true)
291+
finishEnter(el, true, undefined, false)
277292
callHook(onAppearCancelled, [el])
278293
},
279294
onLeaveCancelled(el) {

0 commit comments

Comments
 (0)