Skip to content

Commit 9edbc27

Browse files
committed
fix(transition): fix css:false with hooks with no explicit done callback
close #1149
1 parent 2ff8dca commit 9edbc27

File tree

2 files changed

+50
-14
lines changed

2 files changed

+50
-14
lines changed

packages/runtime-core/src/components/BaseTransition.ts

+9-3
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,9 @@ export function resolveTransitionHooks(
343343
})
344344
if (hook) {
345345
hook(el, done)
346+
if (hook.length <= 1) {
347+
done()
348+
}
346349
} else {
347350
done()
348351
}
@@ -358,7 +361,7 @@ export function resolveTransitionHooks(
358361
}
359362
callHook(onBeforeLeave, [el])
360363
let called = false
361-
const afterLeave = (el._leaveCb = (cancelled?) => {
364+
const done = (el._leaveCb = (cancelled?) => {
362365
if (called) return
363366
called = true
364367
remove()
@@ -374,9 +377,12 @@ export function resolveTransitionHooks(
374377
})
375378
leavingVNodesCache[key] = vnode
376379
if (onLeave) {
377-
onLeave(el, afterLeave)
380+
onLeave(el, done)
381+
if (onLeave.length <= 1) {
382+
done()
383+
}
378384
} else {
379-
afterLeave()
385+
done()
380386
}
381387
}
382388
}

packages/vue/__tests__/Transition.spec.ts

+41-11
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ describe('e2e: Transition', () => {
1111
classList,
1212
isVisible,
1313
timeout,
14-
nextFrame
14+
nextFrame,
15+
click
1516
} = setupPuppeteer()
1617
const baseUrl = `file://${path.resolve(__dirname, './transition.html')}`
1718

@@ -665,27 +666,45 @@ describe('e2e: Transition', () => {
665666
E2E_TIMEOUT
666667
)
667668

668-
// fixme
669669
test(
670670
'css: false',
671671
async () => {
672-
const onLeaveSpy = jest.fn()
672+
const onBeforeEnterSpy = jest.fn()
673673
const onEnterSpy = jest.fn()
674+
const onAfterEnterSpy = jest.fn()
675+
const onBeforeLeaveSpy = jest.fn()
676+
const onLeaveSpy = jest.fn()
677+
const onAfterLeaveSpy = jest.fn()
674678

675-
await page().exposeFunction('onLeaveSpy', onLeaveSpy)
679+
await page().exposeFunction('onBeforeEnterSpy', onBeforeEnterSpy)
676680
await page().exposeFunction('onEnterSpy', onEnterSpy)
681+
await page().exposeFunction('onAfterEnterSpy', onAfterEnterSpy)
682+
await page().exposeFunction('onBeforeLeaveSpy', onBeforeLeaveSpy)
683+
await page().exposeFunction('onLeaveSpy', onLeaveSpy)
684+
await page().exposeFunction('onAfterLeaveSpy', onAfterLeaveSpy)
677685

678686
await page().evaluate(() => {
679-
const { onLeaveSpy, onEnterSpy } = window as any
687+
const {
688+
onBeforeEnterSpy,
689+
onEnterSpy,
690+
onAfterEnterSpy,
691+
onBeforeLeaveSpy,
692+
onLeaveSpy,
693+
onAfterLeaveSpy
694+
} = window as any
680695
const { createApp, ref } = (window as any).Vue
681696
createApp({
682697
template: `
683698
<div id="container">
684699
<transition
685700
:css="false"
686701
name="test"
702+
@before-enter="onBeforeEnterSpy"
687703
@enter="onEnterSpy"
688-
@leave="onLeaveSpy">
704+
@after-enter="onAfterEnterSpy"
705+
@before-leave="onBeforeLeaveSpy"
706+
@leave="onLeaveSpy"
707+
@after-leave="onAfterLeaveSpy">
689708
<div v-if="toggle" class="test">content</div>
690709
</transition>
691710
</div>
@@ -694,21 +713,32 @@ describe('e2e: Transition', () => {
694713
setup: () => {
695714
const toggle = ref(true)
696715
const click = () => (toggle.value = !toggle.value)
697-
return { toggle, click, onLeaveSpy, onEnterSpy }
716+
return {
717+
toggle,
718+
click,
719+
onBeforeEnterSpy,
720+
onEnterSpy,
721+
onAfterEnterSpy,
722+
onBeforeLeaveSpy,
723+
onLeaveSpy,
724+
onAfterLeaveSpy
725+
}
698726
}
699727
}).mount('#app')
700728
})
701729
expect(await html('#container')).toBe('<div class="test">content</div>')
702730

703731
// leave
704-
await classWhenTransitionStart()
732+
await click('#toggleBtn')
733+
expect(onBeforeLeaveSpy).toBeCalled()
705734
expect(onLeaveSpy).toBeCalled()
706-
expect(await html('#container')).toBe(
707-
'<div class="test">content</div><!--v-if-->'
708-
)
735+
expect(onAfterLeaveSpy).toBeCalled()
736+
expect(await html('#container')).toBe('<!--v-if-->')
709737
// enter
710738
await classWhenTransitionStart()
739+
expect(onBeforeEnterSpy).toBeCalled()
711740
expect(onEnterSpy).toBeCalled()
741+
expect(onAfterEnterSpy).toBeCalled()
712742
expect(await html('#container')).toBe('<div class="test">content</div>')
713743
},
714744
E2E_TIMEOUT

0 commit comments

Comments
 (0)