diff --git a/packages-private/vapor-e2e-test/__tests__/transition.spec.ts b/packages-private/vapor-e2e-test/__tests__/transition.spec.ts index 1dce93782e1..70660c72d8f 100644 --- a/packages-private/vapor-e2e-test/__tests__/transition.spec.ts +++ b/packages-private/vapor-e2e-test/__tests__/transition.spec.ts @@ -922,6 +922,380 @@ describe('vapor transition', () => { }) expect(calls).toStrictEqual(['TrueBranch']) }) + + test( + 'switch child then update include (out-in mode)', + async () => { + const containerSelector = '.keep-alive-update-include > div' + const btnSwitchToB = '.keep-alive-update-include > #switchToB' + const btnSwitchToA = '.keep-alive-update-include > #switchToA' + const btnSwitchToC = '.keep-alive-update-include > #switchToC' + + await transitionFinish() + expect(await html(containerSelector)).toBe('
CompA
') + + await click(btnSwitchToB) + await nextTick() + await click(btnSwitchToC) + await transitionFinish() + await transitionFinish() + expect(await html(containerSelector)).toBe('
CompC
') + + await click(btnSwitchToA) + await transitionFinish() + await transitionFinish() + expect(await html(containerSelector)).toBe('
CompA
') + + let calls = await page().evaluate(() => { + return (window as any).getCalls('unmount') + }) + expect(calls).toStrictEqual(['CompC unmounted']) + + // Unlike vdom, CompA does not update because there are no state changes + // expect CompA only update once + // calls = await page().evaluate(() => { + // return (window as any).getCalls('updated') + // }) + // expect(calls).toStrictEqual(['CompA updated']) + }, + E2E_TIMEOUT, + ) + + // #11775 + // test( + // 'switch child then update include (out-in mode)', + // async () => { + // const onUpdatedSpyA = vi.fn() + // const onUnmountedSpyC = vi.fn() + + // await page().exposeFunction('onUpdatedSpyA', onUpdatedSpyA) + // await page().exposeFunction('onUnmountedSpyC', onUnmountedSpyC) + + // await page().evaluate(() => { + // const { onUpdatedSpyA, onUnmountedSpyC } = window as any + // const { createApp, ref, shallowRef, h, onUpdated, onUnmounted } = ( + // window as any + // ).Vue + // createApp({ + // template: ` + //
+ // + // + // + // + // + //
+ // + // + // + // `, + // components: { + // CompA: { + // name: 'CompA', + // setup() { + // onUpdated(onUpdatedSpyA) + // return () => h('div', 'CompA') + // }, + // }, + // CompB: { + // name: 'CompB', + // setup() { + // return () => h('div', 'CompB') + // }, + // }, + // CompC: { + // name: 'CompC', + // setup() { + // onUnmounted(onUnmountedSpyC) + // return () => h('div', 'CompC') + // }, + // }, + // }, + // setup: () => { + // const includeRef = ref(['CompA', 'CompB', 'CompC']) + // const current = shallowRef('CompA') + // const switchToB = () => (current.value = 'CompB') + // const switchToC = () => (current.value = 'CompC') + // const switchToA = () => { + // current.value = 'CompA' + // includeRef.value = ['CompA'] + // } + // return { current, switchToB, switchToC, switchToA, includeRef } + // }, + // }).mount('#app') + // }) + + // await transitionFinish() + // expect(await html('#container')).toBe('
CompA
') + + // await click('#switchToB') + // await nextTick() + // await click('#switchToC') + // await transitionFinish() + // expect(await html('#container')).toBe('
CompC
') + + // await click('#switchToA') + // await transitionFinish() + // expect(await html('#container')).toBe('
CompA
') + + // // expect CompA only update once + // expect(onUpdatedSpyA).toBeCalledTimes(1) + // expect(onUnmountedSpyC).toBeCalledTimes(1) + // }, + // E2E_TIMEOUT, + // ) + + // // #10827 + // test( + // 'switch and update child then update include (out-in mode)', + // async () => { + // const onUnmountedSpyB = vi.fn() + // await page().exposeFunction('onUnmountedSpyB', onUnmountedSpyB) + + // await page().evaluate(() => { + // const { onUnmountedSpyB } = window as any + // const { + // createApp, + // ref, + // shallowRef, + // h, + // provide, + // inject, + // onUnmounted, + // } = (window as any).Vue + // createApp({ + // template: ` + //
+ // + // + // + // + // + //
+ // + // + // `, + // components: { + // CompA: { + // name: 'CompA', + // setup() { + // const current = inject('current') + // return () => h('div', current.value) + // }, + // }, + // CompB: { + // name: 'CompB', + // setup() { + // const current = inject('current') + // onUnmounted(onUnmountedSpyB) + // return () => h('div', current.value) + // }, + // }, + // }, + // setup: () => { + // const includeRef = ref(['CompA']) + // const current = shallowRef('CompA') + // provide('current', current) + + // const switchToB = () => { + // current.value = 'CompB' + // includeRef.value = ['CompA', 'CompB'] + // } + // const switchToA = () => { + // current.value = 'CompA' + // includeRef.value = ['CompA'] + // } + // return { current, switchToB, switchToA, includeRef } + // }, + // }).mount('#app') + // }) + + // await transitionFinish() + // expect(await html('#container')).toBe('
CompA
') + + // await click('#switchToB') + // await transitionFinish() + // await transitionFinish() + // expect(await html('#container')).toBe('
CompB
') + + // await click('#switchToA') + // await transitionFinish() + // await transitionFinish() + // expect(await html('#container')).toBe('
CompA
') + + // expect(onUnmountedSpyB).toBeCalledTimes(1) + // }, + // E2E_TIMEOUT, + // ) + + // // #12860 + // test( + // 'unmount children', + // async () => { + // const unmountSpy = vi.fn() + // let storageContainer: ElementHandle + // const setStorageContainer = (container: any) => + // (storageContainer = container) + // await page().exposeFunction('unmountSpy', unmountSpy) + // await page().exposeFunction('setStorageContainer', setStorageContainer) + // await page().evaluate(() => { + // const { unmountSpy, setStorageContainer } = window as any + // const { createApp, ref, h, onUnmounted, getCurrentInstance } = ( + // window as any + // ).Vue + // createApp({ + // template: ` + //
+ // + // + // + // + // + //
+ // + // `, + // components: { + // TrueBranch: { + // name: 'TrueBranch', + // setup() { + // const instance = getCurrentInstance() + // onUnmounted(() => { + // unmountSpy() + // setStorageContainer(instance.__keepAliveStorageContainer) + // }) + // const count = ref(0) + // return () => h('div', count.value) + // }, + // }, + // }, + // setup: () => { + // const includeRef = ref(['TrueBranch']) + // const toggle = ref(true) + // const click = () => { + // toggle.value = !toggle.value + // if (toggle.value) { + // includeRef.value = ['TrueBranch'] + // } else { + // includeRef.value = [] + // } + // } + // return { toggle, click, unmountSpy, includeRef } + // }, + // }).mount('#app') + // }) + + // await transitionFinish() + // expect(await html('#container')).toBe('
0
') + + // await click('#toggleBtn') + // await transitionFinish() + // expect(await html('#container')).toBe('') + // expect(unmountSpy).toBeCalledTimes(1) + // expect(await storageContainer!.evaluate(x => x.innerHTML)).toBe(``) + // }, + // E2E_TIMEOUT, + // ) + + // // #13153 + // test( + // 'move kept-alive node before v-show transition leave finishes', + // async () => { + // await page().evaluate(() => { + // const { createApp, ref } = (window as any).Vue + // const show = ref(true) + // createApp({ + // template: ` + //
+ // + // + // + //
+ // + // `, + // setup: () => { + // const state = ref(1) + // const click = () => (state.value = state.value === 1 ? 2 : 1) + // return { state, click } + // }, + // components: { + // Comp1: { + // components: { + // Item: { + // name: 'Item', + // setup() { + // return { show } + // }, + // template: ` + // + //
+ //

{{ show ? "I should show" : "I shouldn't show " }}

+ //
+ //
+ // `, + // }, + // }, + // name: 'Comp1', + // setup() { + // const toggle = () => (show.value = !show.value) + // return { show, toggle } + // }, + // template: ` + // + //

This is page1

+ // + // `, + // }, + // Comp2: { + // name: 'Comp2', + // template: `

This is page2

`, + // }, + // }, + // }).mount('#app') + // }) + + // expect(await html('#container')).toBe( + // `

I should show

` + + // `

This is page1

` + + // ``, + // ) + + // // trigger v-show transition leave + // await click('#changeShowBtn') + // await nextTick() + // expect(await html('#container')).toBe( + // `

I shouldn't show

` + + // `

This is page1

` + + // ``, + // ) + + // // switch to page2, before leave finishes + // // expect v-show element's display to be none + // await click('#toggleBtn') + // await nextTick() + // expect(await html('#container')).toBe( + // `` + + // `

This is page2

`, + // ) + + // // switch back to page1 + // // expect v-show element's display to be none + // await click('#toggleBtn') + // await nextTick() + // expect(await html('#container')).toBe( + // `` + + // `

This is page1

` + + // ``, + // ) + + // await transitionFinish() + // expect(await html('#container')).toBe( + // `

I shouldn't show

` + + // `

This is page1

` + + // ``, + // ) + // }, + // E2E_TIMEOUT, + // ) }) describe.todo('transition with Suspense', () => {}) diff --git a/packages-private/vapor-e2e-test/transition/App.vue b/packages-private/vapor-e2e-test/transition/App.vue index e7227ded01e..7b802f768bc 100644 --- a/packages-private/vapor-e2e-test/transition/App.vue +++ b/packages-private/vapor-e2e-test/transition/App.vue @@ -9,6 +9,7 @@ import { template, defineVaporAsyncComponent, onUnmounted, + onUpdated, } from 'vue' const show = ref(true) const toggle = ref(true) @@ -31,6 +32,7 @@ let calls = { showAppear: [], notEnter: [], + updated: [], unmount: [], } window.getCalls = key => calls[key] @@ -117,6 +119,42 @@ const click = () => { includeRef.value = [] } } + +const CompA = defineVaporComponent({ + name: 'CompA', + setup() { + onUpdated(() => { + calls.updated.push('CompA updated') + }) + return template('
CompA
')() + }, +}) + +const CompB = defineVaporComponent({ + name: 'CompB', + setup() { + return template('
CompB
')() + }, +}) + +const CompC = defineVaporComponent({ + name: 'CompC', + setup() { + onUnmounted(() => { + calls.unmount.push('CompC unmounted') + }) + return template('
CompC
')() + }, +}) + +const includeToChange = ref(['CompA', 'CompB', 'CompC']) +const currentView = shallowRef(CompA) +const switchToB = () => (currentView.value = CompB) +const switchToC = () => (currentView.value = CompC) +const switchToA = () => { + currentView.value = CompA + includeToChange.value = ['CompA'] +}