From 7fe6c795a1fc7ddcea5ad91a56141561192373ac Mon Sep 17 00:00:00 2001 From: edison Date: Fri, 13 Sep 2024 17:17:56 +0800 Subject: [PATCH] fix(runtime-core): properly update async component nested in KeepAlive (#11917) close #11916 --- .../__tests__/apiAsyncComponent.spec.ts | 33 +++++++++++++++++++ .../runtime-core/src/apiAsyncComponent.ts | 3 +- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/packages/runtime-core/__tests__/apiAsyncComponent.spec.ts b/packages/runtime-core/__tests__/apiAsyncComponent.spec.ts index 74e24dce65f..5dc78cdb431 100644 --- a/packages/runtime-core/__tests__/apiAsyncComponent.spec.ts +++ b/packages/runtime-core/__tests__/apiAsyncComponent.spec.ts @@ -843,4 +843,37 @@ describe('api: defineAsyncComponent', () => { await timeout() expect(serializeInner(root)).toBe('Bar') }) + + // 11916 + test('with KeepAlive + include', async () => { + const spy = vi.fn() + let resolve: (comp: Component) => void + + const Foo = defineAsyncComponent( + () => + new Promise(r => { + resolve = r as any + }), + ) + + const root = nodeOps.createElement('div') + const app = createApp({ + render: () => h(KeepAlive, { include: 'Foo' }, [h(Foo)]), + }) + + app.mount(root) + await nextTick() + + resolve!({ + name: 'Foo', + setup() { + onActivated(spy) + return () => 'Foo' + }, + }) + + await timeout() + expect(serializeInner(root)).toBe('Foo') + expect(spy).toBeCalledTimes(1) + }) }) diff --git a/packages/runtime-core/src/apiAsyncComponent.ts b/packages/runtime-core/src/apiAsyncComponent.ts index e1c9a0ce06f..199b451f66f 100644 --- a/packages/runtime-core/src/apiAsyncComponent.ts +++ b/packages/runtime-core/src/apiAsyncComponent.ts @@ -14,7 +14,6 @@ import { warn } from './warning' import { ref } from '@vue/reactivity' import { ErrorCodes, handleError } from './errorHandling' import { isKeepAlive } from './components/KeepAlive' -import { queueJob } from './scheduler' import { markAsyncBoundary } from './helpers/useId' import { type HydrationStrategy, forEachElement } from './hydrationStrategies' @@ -210,7 +209,7 @@ export function defineAsyncComponent< if (instance.parent && isKeepAlive(instance.parent.vnode)) { // parent is keep-alive, force update so the loaded component's // name is taken into account - queueJob(instance.parent.update) + instance.parent.update() } }) .catch(err => {