Kaynağa Gözat

fix(runtime-vapor): improve fallback handling support chaining

daiwei 8 ay önce
ebeveyn
işleme
6e4c4d8464
1 değiştirilmiş dosya ile 19 ekleme ve 5 silme
  1. 19 5
      packages/runtime-vapor/src/block.ts

+ 19 - 5
packages/runtime-vapor/src/block.ts

@@ -99,13 +99,27 @@ export class DynamicFragment extends VaporFragment {
   }
 }
 
-function setFragmentFallback(fragment: VaporFragment, fallback: BlockFn): void {
-  // stop recursion if fragment has its own fallback
-  if (fragment.fallback) return
+export function setFragmentFallback(
+  fragment: VaporFragment,
+  fallback: BlockFn,
+): void {
+  if (fragment.fallback) {
+    const originalFallback = fragment.fallback
+    // if the original fallback also renders invalid blocks,
+    // this ensures proper fallback chaining
+    fragment.fallback = () => {
+      const fallbackNodes = originalFallback()
+      if (isValidBlock(fallbackNodes)) {
+        return fallbackNodes
+      }
+      return fallback()
+    }
+  } else {
+    fragment.fallback = fallback
+  }
 
-  fragment.fallback = fallback
   if (isFragment(fragment.nodes)) {
-    setFragmentFallback(fragment.nodes, fallback)
+    setFragmentFallback(fragment.nodes, fragment.fallback)
   }
 }