Browse Source

refactor(runtime-vapor): wrap v-for update renders with slotOwner restore

daiwei 1 month ago
parent
commit
e7692bcf7a
1 changed files with 9 additions and 3 deletions
  1. 9 3
      packages/runtime-vapor/src/apiCreateFor.ts

+ 9 - 3
packages/runtime-vapor/src/apiCreateFor.ts

@@ -173,7 +173,6 @@ export const createFor = (
         }
       }
     } else {
-      const prevOwner = setCurrentSlotOwner(slotOwner)
       parent = parent || parentAnchor!.parentNode
       if (!oldLength) {
         // remove fallback nodes
@@ -401,7 +400,6 @@ export const createFor = (
           }
         }
       }
-      setCurrentSlotOwner(prevOwner)
     }
 
     if (!isFallback) {
@@ -500,7 +498,15 @@ export const createFor = (
   if (flags & VaporVForFlags.ONCE) {
     renderList()
   } else {
-    renderEffect(renderList)
+    renderEffect(() => {
+      if (!isMounted) return renderList()
+      const prevOwner = setCurrentSlotOwner(slotOwner)
+      try {
+        renderList()
+      } finally {
+        setCurrentSlotOwner(prevOwner)
+      }
+    })
   }
 
   if (!isHydrating) {