BaseTransitionProps,
h,
warn,
- FunctionalComponent,
- getCurrentInstance,
- callWithAsyncErrorHandling
+ FunctionalComponent
} from '@vue/runtime-core'
import { isObject, toNumber, extend } from '@vue/shared'
-import { ErrorCodes } from 'packages/runtime-core/src/errorHandling'
const TRANSITION = 'transition'
const ANIMATION = 'animation'
return baseProps
}
- const instance = getCurrentInstance()!
const durations = normalizeDuration(duration)
const enterDuration = durations && durations[0]
const leaveDuration = durations && durations[1]
onEnterCancelled,
onLeave,
onLeaveCancelled,
- onBeforeAppear,
- onAppear,
- onAppearCancelled
+ onBeforeAppear = onBeforeEnter,
+ onAppear = onEnter,
+ onAppearCancelled = onEnterCancelled
} = baseProps
- type HookWithDone = (el: Element, done: () => void) => void
- type Hook = HookWithDone | ((el: Element) => void)
-
const finishEnter = (el: Element, isAppear: boolean, done?: () => void) => {
removeTransitionClass(el, isAppear ? appearToClass : enterToClass)
removeTransitionClass(el, isAppear ? appearActiveClass : enterActiveClass)
done && done()
}
- // only needed for user hooks called in nextFrame
- // sync errors are already handled by BaseTransition
- const callHook = (hook: Hook | undefined, args: any[]) => {
- hook &&
- callWithAsyncErrorHandling(
- hook,
- instance,
- ErrorCodes.TRANSITION_HOOK,
- args
- )
- }
-
- const makeEnterHook = (isAppear: boolean): HookWithDone => {
- const hook = isAppear ? onAppear : onEnter
- return (el, done) => {
+ const makeEnterHook = (isAppear: boolean) => {
+ return (el: Element, done: () => void) => {
+ const hook = isAppear ? onAppear : onEnter
+ const resolve = () => finishEnter(el, isAppear, done)
+ hook && hook(el, resolve)
nextFrame(() => {
- const resolve = () => finishEnter(el, isAppear, done)
- callHook(hook, [el, resolve])
removeTransitionClass(el, isAppear ? appearFromClass : enterFromClass)
addTransitionClass(el, isAppear ? appearToClass : enterToClass)
if (!(hook && hook.length > 1)) {
onEnter: makeEnterHook(false),
onAppear: makeEnterHook(true),
onLeave(el, done) {
+ const resolve = () => finishLeave(el, done)
addTransitionClass(el, leaveActiveClass)
addTransitionClass(el, leaveFromClass)
nextFrame(() => {
- const resolve = () => finishLeave(el, done)
- callHook(onLeave, [el, resolve])
removeTransitionClass(el, leaveFromClass)
addTransitionClass(el, leaveToClass)
if (!(onLeave && onLeave.length > 1)) {
}
}
})
+ onLeave && onLeave(el, resolve)
},
onEnterCancelled(el) {
finishEnter(el, false)
])
// todo test event with arguments. Note: not get dom, get object. '{}'
expect(beforeLeaveSpy).toBeCalled()
- expect(onLeaveSpy).not.toBeCalled()
+ expect(onLeaveSpy).toBeCalled()
expect(afterLeaveSpy).not.toBeCalled()
await nextFrame()
expect(await classList('.test')).toStrictEqual([
'test-leave-active',
'test-leave-to'
])
- expect(beforeLeaveSpy).toBeCalled()
expect(afterLeaveSpy).not.toBeCalled()
await transitionFinish()
expect(await html('#container')).toBe('<!--v-if-->')
'test-enter-from'
])
expect(beforeEnterSpy).toBeCalled()
- expect(onEnterSpy).not.toBeCalled()
+ expect(onEnterSpy).toBeCalled()
expect(afterEnterSpy).not.toBeCalled()
await nextFrame()
expect(await classList('.test')).toStrictEqual([
'test-enter-active',
'test-enter-to'
])
- expect(onEnterSpy).toBeCalled()
expect(afterEnterSpy).not.toBeCalled()
await transitionFinish()
expect(await html('#container')).toBe('<div class="test">content</div>')
'test-appear-from'
])
expect(beforeAppearSpy).toBeCalled()
- expect(onAppearSpy).not.toBeCalled()
+ expect(onAppearSpy).toBeCalled()
expect(afterAppearSpy).not.toBeCalled()
await nextFrame()
expect(await classList('.test')).toStrictEqual([
'test-appear-active',
'test-appear-to'
])
- expect(onAppearSpy).toBeCalled()
expect(afterAppearSpy).not.toBeCalled()
await transitionFinish()
expect(await html('#container')).toBe('<div class="test">content</div>')
'test-leave-from'
])
expect(beforeLeaveSpy).toBeCalled()
- expect(onLeaveSpy).not.toBeCalled()
+ expect(onLeaveSpy).toBeCalled()
expect(afterLeaveSpy).not.toBeCalled()
await nextFrame()
expect(await classList('.test')).toStrictEqual([
'test-leave-active',
'test-leave-to'
])
- expect(onLeaveSpy).toBeCalled()
expect(afterLeaveSpy).not.toBeCalled()
await transitionFinish()
expect(await html('#container')).toBe('<!--v-if-->')
'test-enter-from'
])
expect(beforeEnterSpy).toBeCalled()
- expect(onEnterSpy).not.toBeCalled()
+ expect(onEnterSpy).toBeCalled()
expect(afterEnterSpy).not.toBeCalled()
await nextFrame()
expect(await classList('.test')).toStrictEqual([
'test-enter-active',
'test-enter-to'
])
- expect(onEnterSpy).toBeCalled()
expect(afterEnterSpy).not.toBeCalled()
await transitionFinish()
expect(await html('#container')).toBe('<div class="test">content</div>')
'test-leave-from'
])
expect(beforeLeaveSpy).toBeCalled()
- expect(onLeaveSpy).not.toBeCalled()
+ expect(onLeaveSpy).toBeCalled()
expect(afterLeaveSpy).not.toBeCalled()
await nextFrame()
expect(await classList('.test')).toStrictEqual([
'test-leave-active',
'test-leave-to'
])
- expect(beforeLeaveSpy).toBeCalled()
expect(afterLeaveSpy).not.toBeCalled()
await transitionFinish()
expect(await isVisible('.test')).toBe(false)
'test-enter-from'
])
expect(beforeEnterSpy).toBeCalled()
- expect(onEnterSpy).not.toBeCalled()
+ expect(onEnterSpy).toBeCalled()
expect(afterEnterSpy).not.toBeCalled()
await nextFrame()
expect(await classList('.test')).toStrictEqual([
'test-enter-active',
'test-enter-to'
])
- expect(onEnterSpy).toBeCalled()
expect(afterEnterSpy).not.toBeCalled()
await transitionFinish()
expect(await html('#container')).toBe(
})
})
expect(beforeAppearSpy).toBeCalled()
- expect(onAppearSpy).not.toBeCalled()
+ expect(onAppearSpy).toBeCalled()
expect(afterAppearSpy).not.toBeCalled()
expect(appearHtml).toBe(
`<div class="test test-appear-active test-appear-from">a</div>` +
`<div class="test test-appear-active test-appear-from">c</div>`
)
await nextFrame()
- expect(onAppearSpy).toBeCalled()
expect(afterAppearSpy).not.toBeCalled()
expect(await html('#container')).toBe(
`<div class="test test-appear-active test-appear-to">a</div>` +
`<div class="test test-enter-active test-enter-from">d</div>`
)
expect(beforeLeaveSpy).toBeCalled()
- expect(onLeaveSpy).not.toBeCalled()
+ expect(onLeaveSpy).toBeCalled()
expect(afterLeaveSpy).not.toBeCalled()
expect(beforeEnterSpy).toBeCalled()
- expect(onEnterSpy).not.toBeCalled()
+ expect(onEnterSpy).toBeCalled()
expect(afterEnterSpy).not.toBeCalled()
await nextFrame()
expect(await html('#container')).toBe(
`<div class="test">c</div>` +
`<div class="test test-enter-active test-enter-to">d</div>`
)
- expect(onLeaveSpy).toBeCalled()
expect(afterLeaveSpy).not.toBeCalled()
- expect(onEnterSpy).toBeCalled()
expect(afterEnterSpy).not.toBeCalled()
await transitionFinish()
expect(await html('#container')).toBe(