fix(transition/v-show): ensure transition is in persisted mode when used with v-show

fix #4845
close #4852
This commit is contained in:
Evan You
2022-05-11 19:22:55 +08:00
parent 2bab639683
commit 425310e8b6
8 changed files with 319 additions and 166 deletions

View File

@@ -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', () => {