From: daiwei Date: Tue, 20 May 2025 08:51:39 +0000 (+0800) Subject: wip: save X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=799004696e176f37bbd86e444aabd55df53ac401;p=thirdparty%2Fvuejs%2Fcore.git wip: save --- diff --git a/packages/runtime-vapor/__tests__/components/Suspense.spec.ts b/packages/runtime-vapor/__tests__/components/Suspense.spec.ts index 6bec5b8a38..36cafc55f3 100644 --- a/packages/runtime-vapor/__tests__/components/Suspense.spec.ts +++ b/packages/runtime-vapor/__tests__/components/Suspense.spec.ts @@ -35,11 +35,12 @@ describe('vapor / vdom interop', () => { return { container } } - function asyncWrapper(code: string) { + function withAsyncScript(code: string) { return { code: ` + `, + { + AsyncOuter: withAsyncScript( + ``, + ), + AsyncInner: withAsyncScript(``), + }, + data, + ) + + expect(container.innerHTML).toBe(`fallback`) + + await data.deps[0] + await nextTick() + expect(container.innerHTML).toBe(`fallback`) + + await Promise.all(data.deps) + await nextTick() + expect(container.innerHTML).toBe(`
inner
`) + }) }) diff --git a/packages/runtime-vapor/src/component.ts b/packages/runtime-vapor/src/component.ts index f82ae26829..b169f01260 100644 --- a/packages/runtime-vapor/src/component.ts +++ b/packages/runtime-vapor/src/component.ts @@ -67,6 +67,7 @@ import { import { hmrReload, hmrRerender } from './hmr' import { isHydrating, locateHydrationNode } from './dom/hydration' import { insertionAnchor, insertionParent } from './insertionState' +import { parentSuspense } from './components/Suspense' export { currentInstance } from '@vue/runtime-dom' @@ -144,7 +145,6 @@ export function createComponent( appContext: GenericAppContext = (currentInstance && currentInstance.appContext) || emptyContext, - parentSuspense?: SuspenseBoundary | null, ): VaporComponentInstance { const _insertionParent = insertionParent const _insertionAnchor = insertionAnchor @@ -483,6 +483,30 @@ export function mountComponent( parent: ParentNode, anchor?: Node | null | 0, ): void { + if ( + __FEATURE_SUSPENSE__ && + instance.suspense && + instance.asyncDep && + !instance.asyncResolved + ) { + const component = instance.type as any + instance.suspense.registerDep( + instance as any, + (setupResult: any) => { + handleSetupResult( + setupResult, + component, + instance, + undefined, + isFunction(component) ? component : component.setup, + ) + mountComponent(instance, parent, anchor) + }, + false, + ) + return + } + if (__DEV__) { startMeasure(instance, `mount`) } diff --git a/packages/runtime-vapor/src/components/Suspense.ts b/packages/runtime-vapor/src/components/Suspense.ts new file mode 100644 index 0000000000..5dafe58426 --- /dev/null +++ b/packages/runtime-vapor/src/components/Suspense.ts @@ -0,0 +1,13 @@ +import type { SuspenseBoundary } from '@vue/runtime-dom' + +export let parentSuspense: SuspenseBoundary | null = null +export function setParentSuspense(suspense: SuspenseBoundary | null): void { + parentSuspense = suspense +} + +// TODO +export const VaporSuspenseImpl = { + name: 'VaporSuspense', + __isSuspense: true, + process(): void {}, +} diff --git a/packages/runtime-vapor/src/vdomInterop.ts b/packages/runtime-vapor/src/vdomInterop.ts index 8269b20172..fed9666e0a 100644 --- a/packages/runtime-vapor/src/vdomInterop.ts +++ b/packages/runtime-vapor/src/vdomInterop.ts @@ -23,7 +23,6 @@ import { type VaporComponent, VaporComponentInstance, createComponent, - handleSetupResult, mountComponent, unmountComponent, } from './component' @@ -34,6 +33,7 @@ import type { RawSlots, VaporSlot } from './componentSlots' import { renderEffect } from './renderEffect' import { createTextNode } from './dom/node' import { optimizePropertyLookup } from './dom/prop' +import { setParentSuspense } from './components/Suspense' // mounting vapor components and slots in vdom const vaporInteropImpl: Omit< @@ -49,6 +49,10 @@ const vaporInteropImpl: Omit< const propsRef = shallowRef(vnode.props) const slotsRef = shallowRef(vnode.children) + if (__FEATURE_SUSPENSE__) { + setParentSuspense(parentSuspense) + } + const component = vnode.type as any as VaporComponent // @ts-expect-error const instance = (vnode.component = createComponent( @@ -61,28 +65,10 @@ const vaporInteropImpl: Omit< } as any as RawSlots, undefined, undefined, - parentSuspense, )) instance.rawPropsRef = propsRef instance.rawSlotsRef = slotsRef - if (__FEATURE_SUSPENSE__ && parentSuspense && instance.asyncDep) { - parentSuspense.registerDep( - instance as any, - (setupResult: any) => { - handleSetupResult( - setupResult, - component, - instance, - undefined, - isFunction(component) ? component : component.setup, - ) - mountComponent(instance, container, selfAnchor) - }, - false, - ) - } else { - mountComponent(instance, container, selfAnchor) - } + mountComponent(instance, container, selfAnchor) simpleSetCurrentInstance(prev) return instance },