소스 검색

fix(runtime-vapor): prevent fragment `updated` hooks from running before the fragment is mounted. (#14123)

edison 5 달 전
부모
커밋
b07fa60d5f
3개의 변경된 파일5개의 추가작업 그리고 4개의 파일을 삭제
  1. 1 1
      packages/runtime-vapor/src/apiCreateFor.ts
  2. 2 1
      packages/runtime-vapor/src/fragment.ts
  3. 2 2
      packages/runtime-vapor/src/vdomInterop.ts

+ 1 - 1
packages/runtime-vapor/src/apiCreateFor.ts

@@ -403,7 +403,7 @@ export const createFor = (
       oldBlocks = []
     }
 
-    if (frag.updated) frag.updated.forEach(m => m())
+    if (isMounted && frag.updated) frag.updated.forEach(m => m())
     setActiveSub(prevSub)
   }
 

+ 2 - 1
packages/runtime-vapor/src/fragment.ts

@@ -191,7 +191,8 @@ export class DynamicFragment extends VaporFragment {
 
       if (parent) {
         insert(this.nodes, parent, this.anchor)
-        if (this.updated) {
+        // anchor isConnected indicates the this render is updated
+        if (this.anchor.isConnected && this.updated) {
           this.updated.forEach(hook => hook(this.nodes))
         }
       }

+ 2 - 2
packages/runtime-vapor/src/vdomInterop.ts

@@ -383,7 +383,7 @@ function createVDOMComponent(
     }
 
     frag.nodes = vnode.el as any
-    if (frag.updated) frag.updated.forEach(m => m())
+    if (isMounted && frag.updated) frag.updated.forEach(m => m())
   }
 
   frag.remove = unmount
@@ -450,7 +450,7 @@ function renderVDOMSlot(
       }
     }
 
-    if (frag.updated) frag.updated.forEach(m => m())
+    if (isMounted && frag.updated) frag.updated.forEach(m => m())
   }
 
   const render = (parentNode?: ParentNode, anchor?: Node | null) => {