fix(transition/v-show): ensure transition is in persisted mode when used with v-show
fix #4845 close #4852
This commit is contained in:
@@ -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', () => {
|
||||
|
||||
Reference in New Issue
Block a user