Skip to content

Commit acd3156

Browse files
committed
fix(transition): fix dom transition cancel hooks not being called
1 parent b3bdd70 commit acd3156

File tree

2 files changed

+35
-16
lines changed

2 files changed

+35
-16
lines changed

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

+31-10
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,14 @@ export function resolveTransitionProps(
9999
const durations = normalizeDuration(duration)
100100
const enterDuration = durations && durations[0]
101101
const leaveDuration = durations && durations[1]
102-
const { appear, onBeforeEnter, onEnter, onLeave } = baseProps
102+
const {
103+
appear,
104+
onBeforeEnter,
105+
onEnter,
106+
onLeave,
107+
onEnterCancelled,
108+
onLeaveCancelled
109+
} = baseProps
103110

104111
// is appearing
105112
if (appear && !instance.isMounted) {
@@ -108,9 +115,11 @@ export function resolveTransitionProps(
108115
enterToClass = appearToClass
109116
}
110117

111-
type Hook = (el: Element, done?: () => void) => void
118+
type Hook =
119+
| ((el: Element, done: () => void) => void)
120+
| ((el: Element) => void)
112121

113-
const finishEnter: Hook = (el, done) => {
122+
const finishEnter = (el: Element, done?: () => void) => {
114123
removeTransitionClass(el, enterToClass)
115124
removeTransitionClass(el, enterActiveClass)
116125
done && done()
@@ -120,16 +129,22 @@ export function resolveTransitionProps(
120129
}
121130
}
122131

123-
const finishLeave: Hook = (el, done) => {
132+
const finishLeave = (el: Element, done?: () => void) => {
124133
removeTransitionClass(el, leaveToClass)
125134
removeTransitionClass(el, leaveActiveClass)
126135
done && done()
127136
}
128137

129138
// only needed for user hooks called in nextFrame
130139
// sync errors are already handled by BaseTransition
131-
function callHookWithErrorHandling(hook: Hook, args: any[]) {
132-
callWithAsyncErrorHandling(hook, instance, ErrorCodes.TRANSITION_HOOK, args)
140+
const callHook = (hook: Hook | undefined, args: any[]) => {
141+
hook &&
142+
callWithAsyncErrorHandling(
143+
hook,
144+
instance,
145+
ErrorCodes.TRANSITION_HOOK,
146+
args
147+
)
133148
}
134149

135150
return extend(baseProps, {
@@ -141,7 +156,7 @@ export function resolveTransitionProps(
141156
onEnter(el, done) {
142157
nextFrame(() => {
143158
const resolve = () => finishEnter(el, done)
144-
onEnter && callHookWithErrorHandling(onEnter as Hook, [el, resolve])
159+
callHook(onEnter, [el, resolve])
145160
removeTransitionClass(el, enterFromClass)
146161
addTransitionClass(el, enterToClass)
147162
if (!(onEnter && onEnter.length > 1)) {
@@ -158,7 +173,7 @@ export function resolveTransitionProps(
158173
addTransitionClass(el, leaveFromClass)
159174
nextFrame(() => {
160175
const resolve = () => finishLeave(el, done)
161-
onLeave && callHookWithErrorHandling(onLeave as Hook, [el, resolve])
176+
callHook(onLeave, [el, resolve])
162177
removeTransitionClass(el, leaveFromClass)
163178
addTransitionClass(el, leaveToClass)
164179
if (!(onLeave && onLeave.length > 1)) {
@@ -170,8 +185,14 @@ export function resolveTransitionProps(
170185
}
171186
})
172187
},
173-
onEnterCancelled: finishEnter,
174-
onLeaveCancelled: finishLeave
188+
onEnterCancelled(el) {
189+
finishEnter(el)
190+
onEnterCancelled && onEnterCancelled(el)
191+
},
192+
onLeaveCancelled(el) {
193+
finishLeave(el)
194+
onLeaveCancelled && onLeaveCancelled(el)
195+
}
175196
} as BaseTransitionProps<Element>)
176197
}
177198

packages/vue/__tests__/Transition.spec.ts

+4-6
Original file line numberDiff line numberDiff line change
@@ -433,8 +433,7 @@ describe('e2e: Transition', () => {
433433
'test-leave-active',
434434
'test-leave-from'
435435
])
436-
// fixme
437-
expect(enterCancelledSpy).not.toBeCalled()
436+
expect(enterCancelledSpy).toBeCalled()
438437
await nextFrame()
439438
expect(await classList('.test')).toStrictEqual([
440439
'test',
@@ -1255,8 +1254,8 @@ describe('e2e: Transition', () => {
12551254
createApp({
12561255
template: `
12571256
<div id="container">
1258-
<transition name="test">
1259-
<div v-show="toggle" class="test" @leave-cancelled="onLeaveCancelledSpy">content</div>
1257+
<transition name="test" @leave-cancelled="onLeaveCancelledSpy">
1258+
<div v-show="toggle" class="test">content</div>
12601259
</transition>
12611260
</div>
12621261
<button id="toggleBtn" @click="click">button</button>
@@ -1290,8 +1289,7 @@ describe('e2e: Transition', () => {
12901289
'test-enter-active',
12911290
'test-enter-from'
12921291
])
1293-
// fixme
1294-
expect(onLeaveCancelledSpy).not.toBeCalled()
1292+
expect(onLeaveCancelledSpy).toBeCalled()
12951293
await nextFrame()
12961294
expect(await classList('.test')).toStrictEqual([
12971295
'test',

0 commit comments

Comments
 (0)