|
|
@@ -7,7 +7,14 @@ import {
|
|
|
KeepAlive,
|
|
|
serializeInner,
|
|
|
nextTick,
|
|
|
- ComponentOptions
|
|
|
+ ComponentOptions,
|
|
|
+ markRaw,
|
|
|
+ inject,
|
|
|
+ defineComponent,
|
|
|
+ ComponentPublicInstance,
|
|
|
+ Ref,
|
|
|
+ cloneVNode,
|
|
|
+ provide
|
|
|
} from '@vue/runtime-test'
|
|
|
import { KeepAliveProps } from '../../src/components/KeepAlive'
|
|
|
|
|
|
@@ -559,4 +566,91 @@ describe('KeepAlive', () => {
|
|
|
expect(serializeInner(root)).toBe(`1`)
|
|
|
})
|
|
|
})
|
|
|
+
|
|
|
+ it('should not call onVnodeUnmounted', async () => {
|
|
|
+ const Foo = markRaw({
|
|
|
+ name: 'Foo',
|
|
|
+ render() {
|
|
|
+ return h('Foo')
|
|
|
+ }
|
|
|
+ })
|
|
|
+ const Bar = markRaw({
|
|
|
+ name: 'Bar',
|
|
|
+ render() {
|
|
|
+ return h('Bar')
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ const spyMounted = jest.fn()
|
|
|
+ const spyUnmounted = jest.fn()
|
|
|
+
|
|
|
+ const RouterView = defineComponent({
|
|
|
+ setup(_, { slots }) {
|
|
|
+ const Component = inject<Ref<ComponentPublicInstance>>('component')
|
|
|
+ const refView = ref()
|
|
|
+
|
|
|
+ let componentProps = {
|
|
|
+ ref: refView,
|
|
|
+ onVnodeMounted() {
|
|
|
+ spyMounted()
|
|
|
+ },
|
|
|
+ onVnodeUnmounted() {
|
|
|
+ spyUnmounted()
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return () => {
|
|
|
+ const child: any = slots.default!({
|
|
|
+ Component: Component!.value
|
|
|
+ })[0]
|
|
|
+
|
|
|
+ const innerChild = child.children[0]
|
|
|
+ child.children[0] = cloneVNode(innerChild, componentProps)
|
|
|
+ return child
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ let toggle: () => void = () => {}
|
|
|
+
|
|
|
+ const App = defineComponent({
|
|
|
+ setup() {
|
|
|
+ const component = ref(Foo)
|
|
|
+
|
|
|
+ provide('component', component)
|
|
|
+
|
|
|
+ toggle = () => {
|
|
|
+ component.value = component.value === Foo ? Bar : Foo
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ component,
|
|
|
+ toggle
|
|
|
+ }
|
|
|
+ },
|
|
|
+ render() {
|
|
|
+ return h(RouterView, null, {
|
|
|
+ default: ({ Component }: any) => h(KeepAlive, null, [h(Component)])
|
|
|
+ })
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ render(h(App), root)
|
|
|
+ await nextTick()
|
|
|
+ expect(spyMounted).toHaveBeenCalledTimes(1)
|
|
|
+ expect(spyUnmounted).toHaveBeenCalledTimes(0)
|
|
|
+
|
|
|
+ toggle()
|
|
|
+ await nextTick()
|
|
|
+
|
|
|
+ expect(spyMounted).toHaveBeenCalledTimes(2)
|
|
|
+ expect(spyUnmounted).toHaveBeenCalledTimes(0)
|
|
|
+
|
|
|
+ toggle()
|
|
|
+ await nextTick()
|
|
|
+ render(null, root)
|
|
|
+ await nextTick()
|
|
|
+
|
|
|
+ expect(spyMounted).toHaveBeenCalledTimes(2)
|
|
|
+ expect(spyUnmounted).toHaveBeenCalledTimes(2)
|
|
|
+ })
|
|
|
})
|