From 2723f0d428025423770cb48b3988390b475bed8f Mon Sep 17 00:00:00 2001 From: daiwei Date: Mon, 1 Dec 2025 14:54:59 +0800 Subject: [PATCH] refactor: introduce `setAsyncRef` on `DynamicFragment` for explicit async component ref assignment. --- .../runtime-vapor/src/apiDefineAsyncComponent.ts | 3 +-- packages/runtime-vapor/src/apiTemplateRef.ts | 13 ++++++------- packages/runtime-vapor/src/fragment.ts | 3 +++ 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/runtime-vapor/src/apiDefineAsyncComponent.ts b/packages/runtime-vapor/src/apiDefineAsyncComponent.ts index 48590177694..0ee285d4c2d 100644 --- a/packages/runtime-vapor/src/apiDefineAsyncComponent.ts +++ b/packages/runtime-vapor/src/apiDefineAsyncComponent.ts @@ -197,8 +197,7 @@ function createInnerComp( if ($transition) setTransitionHooks(instance, $transition) // set ref - // @ts-expect-error - frag && frag.setRef && frag.setRef(instance) + frag && frag.setAsyncRef && frag.setAsyncRef(instance) return instance } diff --git a/packages/runtime-vapor/src/apiTemplateRef.ts b/packages/runtime-vapor/src/apiTemplateRef.ts index 33784d67009..328748feb78 100644 --- a/packages/runtime-vapor/src/apiTemplateRef.ts +++ b/packages/runtime-vapor/src/apiTemplateRef.ts @@ -62,13 +62,12 @@ export function setRef( return } - const isVaporComp = isVaporComponent(el) - if (isVaporComp && isAsyncWrapper(el as VaporComponentInstance)) { - const i = el as VaporComponentInstance - const frag = i.block as DynamicFragment - // async component not resolved yet - if (!i.type.__asyncResolved) { - frag.setRef = i => setRef(instance, i, ref, oldRef, refFor) + if (isVaporComponent(el) && isAsyncWrapper(el)) { + const frag = el.block as DynamicFragment + // async component not resolved yet, register ref setter + // it will be called when the async component is resolved + if (!el.type.__asyncResolved) { + frag.setAsyncRef = i => setRef(instance, i, ref, oldRef, refFor) return } diff --git a/packages/runtime-vapor/src/fragment.ts b/packages/runtime-vapor/src/fragment.ts index 287980ed4b0..ed0b64e4246 100644 --- a/packages/runtime-vapor/src/fragment.ts +++ b/packages/runtime-vapor/src/fragment.ts @@ -83,6 +83,9 @@ export class DynamicFragment extends VaporFragment { // fallthrough attrs attrs?: Record + // set ref for async wrapper + setAsyncRef?: (instance: VaporComponentInstance) => void + // get the kept-alive scope when used in keep-alive getScope?: (key: any) => EffectScope | undefined