|
|
@@ -1614,8 +1614,17 @@ describe('e2e: Transition', () => {
|
|
|
test(
|
|
|
'transition on appear with v-show',
|
|
|
async () => {
|
|
|
+ const beforeEnterSpy = jest.fn()
|
|
|
+ const onEnterSpy = jest.fn()
|
|
|
+ const afterEnterSpy = jest.fn()
|
|
|
+
|
|
|
+ await page().exposeFunction('onEnterSpy', onEnterSpy)
|
|
|
+ await page().exposeFunction('beforeEnterSpy', beforeEnterSpy)
|
|
|
+ await page().exposeFunction('afterEnterSpy', afterEnterSpy)
|
|
|
+
|
|
|
const appearClass = await page().evaluate(async () => {
|
|
|
const { createApp, ref } = (window as any).Vue
|
|
|
+ const { beforeEnterSpy, onEnterSpy, afterEnterSpy } = window as any
|
|
|
createApp({
|
|
|
template: `
|
|
|
<div id="container">
|
|
|
@@ -1623,7 +1632,10 @@ describe('e2e: Transition', () => {
|
|
|
appear
|
|
|
appear-from-class="test-appear-from"
|
|
|
appear-to-class="test-appear-to"
|
|
|
- appear-active-class="test-appear-active">
|
|
|
+ appear-active-class="test-appear-active"
|
|
|
+ @before-enter="beforeEnterSpy"
|
|
|
+ @enter="onEnterSpy"
|
|
|
+ @after-enter="afterEnterSpy">
|
|
|
<div v-show="toggle" class="test">content</div>
|
|
|
</transition>
|
|
|
</div>
|
|
|
@@ -1632,13 +1644,24 @@ describe('e2e: Transition', () => {
|
|
|
setup: () => {
|
|
|
const toggle = ref(true)
|
|
|
const click = () => (toggle.value = !toggle.value)
|
|
|
- return { toggle, click }
|
|
|
+ return {
|
|
|
+ toggle,
|
|
|
+ click,
|
|
|
+ beforeEnterSpy,
|
|
|
+ onEnterSpy,
|
|
|
+ afterEnterSpy
|
|
|
+ }
|
|
|
}
|
|
|
}).mount('#app')
|
|
|
return Promise.resolve().then(() => {
|
|
|
return document.querySelector('.test')!.className.split(/\s+/g)
|
|
|
})
|
|
|
})
|
|
|
+
|
|
|
+ expect(beforeEnterSpy).toBeCalledTimes(1)
|
|
|
+ expect(onEnterSpy).toBeCalledTimes(1)
|
|
|
+ expect(afterEnterSpy).toBeCalledTimes(0)
|
|
|
+
|
|
|
// appear
|
|
|
expect(appearClass).toStrictEqual([
|
|
|
'test',
|
|
|
@@ -1654,6 +1677,10 @@ describe('e2e: Transition', () => {
|
|
|
await transitionFinish()
|
|
|
expect(await html('#container')).toBe('<div class="test">content</div>')
|
|
|
|
|
|
+ expect(beforeEnterSpy).toBeCalledTimes(1)
|
|
|
+ expect(onEnterSpy).toBeCalledTimes(1)
|
|
|
+ expect(afterEnterSpy).toBeCalledTimes(1)
|
|
|
+
|
|
|
// leave
|
|
|
expect(await classWhenTransitionStart()).toStrictEqual([
|
|
|
'test',
|
|
|
@@ -1688,6 +1715,79 @@ describe('e2e: Transition', () => {
|
|
|
},
|
|
|
E2E_TIMEOUT
|
|
|
)
|
|
|
+
|
|
|
+ // #4845
|
|
|
+ test(
|
|
|
+ 'transition events should not call onEnter with v-show false',
|
|
|
+ async () => {
|
|
|
+ const beforeEnterSpy = jest.fn()
|
|
|
+ const onEnterSpy = jest.fn()
|
|
|
+ const afterEnterSpy = jest.fn()
|
|
|
+
|
|
|
+ await page().exposeFunction('onEnterSpy', onEnterSpy)
|
|
|
+ await page().exposeFunction('beforeEnterSpy', beforeEnterSpy)
|
|
|
+ await page().exposeFunction('afterEnterSpy', afterEnterSpy)
|
|
|
+
|
|
|
+ await page().evaluate(() => {
|
|
|
+ const { beforeEnterSpy, onEnterSpy, afterEnterSpy } = window as any
|
|
|
+ const { createApp, ref } = (window as any).Vue
|
|
|
+ createApp({
|
|
|
+ template: `
|
|
|
+ <div id="container">
|
|
|
+ <transition
|
|
|
+ name="test"
|
|
|
+ appear
|
|
|
+ @before-enter="beforeEnterSpy"
|
|
|
+ @enter="onEnterSpy"
|
|
|
+ @after-enter="afterEnterSpy">
|
|
|
+ <div v-show="toggle" class="test">content</div>
|
|
|
+ </transition>
|
|
|
+ </div>
|
|
|
+ <button id="toggleBtn" @click="click">button</button>
|
|
|
+ `,
|
|
|
+ setup: () => {
|
|
|
+ const toggle = ref(false)
|
|
|
+ const click = () => (toggle.value = !toggle.value)
|
|
|
+ return {
|
|
|
+ toggle,
|
|
|
+ click,
|
|
|
+ beforeEnterSpy,
|
|
|
+ onEnterSpy,
|
|
|
+ afterEnterSpy
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }).mount('#app')
|
|
|
+ })
|
|
|
+ await nextTick()
|
|
|
+
|
|
|
+ expect(await isVisible('.test')).toBe(false)
|
|
|
+
|
|
|
+ expect(beforeEnterSpy).toBeCalledTimes(0)
|
|
|
+ expect(onEnterSpy).toBeCalledTimes(0)
|
|
|
+ // enter
|
|
|
+ expect(await classWhenTransitionStart()).toStrictEqual([
|
|
|
+ 'test',
|
|
|
+ 'test-enter-from',
|
|
|
+ 'test-enter-active'
|
|
|
+ ])
|
|
|
+ expect(beforeEnterSpy).toBeCalledTimes(1)
|
|
|
+ expect(onEnterSpy).toBeCalledTimes(1)
|
|
|
+ expect(afterEnterSpy).not.toBeCalled()
|
|
|
+ await nextFrame()
|
|
|
+ expect(await classList('.test')).toStrictEqual([
|
|
|
+ 'test',
|
|
|
+ 'test-enter-active',
|
|
|
+ 'test-enter-to'
|
|
|
+ ])
|
|
|
+ expect(afterEnterSpy).not.toBeCalled()
|
|
|
+ await transitionFinish()
|
|
|
+ expect(await html('#container')).toBe(
|
|
|
+ '<div class="test" style="">content</div>'
|
|
|
+ )
|
|
|
+ expect(afterEnterSpy).toBeCalled()
|
|
|
+ },
|
|
|
+ E2E_TIMEOUT
|
|
|
+ )
|
|
|
})
|
|
|
|
|
|
describe('explicit durations', () => {
|