]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
refactor: introduce `setAsyncRef` on `DynamicFragment` for explicit async component...
authoredison <daiwei521@126.com>
Mon, 1 Dec 2025 07:20:57 +0000 (15:20 +0800)
committerGitHub <noreply@github.com>
Mon, 1 Dec 2025 07:20:57 +0000 (15:20 +0800)
packages/runtime-vapor/src/apiDefineAsyncComponent.ts
packages/runtime-vapor/src/apiTemplateRef.ts
packages/runtime-vapor/src/fragment.ts

index 48590177694f0be306bf6156f78d2ae27df42597..0ee285d4c2d1aa1d2152ad78379d5fe4fc23ad73 100644 (file)
@@ -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
 }
index 33784d670091beec24ba555ef7415cfa34bc142b..328748feb788366caebc2e9c2771121c4c5d46fc 100644 (file)
@@ -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
     }
 
index 287980ed4b0b37b79d273da148ed68ec49f927e3..ed0b64e4246ec4f4212a8ecde5195af9fe8926bc 100644 (file)
@@ -83,6 +83,9 @@ export class DynamicFragment extends VaporFragment {
   // fallthrough attrs
   attrs?: Record<string, any>
 
+  // set ref for async wrapper
+  setAsyncRef?: (instance: VaporComponentInstance) => void
+
   // get the kept-alive scope when used in keep-alive
   getScope?: (key: any) => EffectScope | undefined