Преглед изворни кода

wip: vapor app.unmount + unmounted hooks

Evan You пре 1 година
родитељ
комит
366dcb7c76
2 измењених фајлова са 19 додато и 10 уклоњено
  1. 9 4
      packages/runtime-vapor/src/apiCreateApp.ts
  2. 10 6
      packages/runtime-vapor/src/component.ts

+ 9 - 4
packages/runtime-vapor/src/apiCreateApp.ts

@@ -1,5 +1,10 @@
-import { insert } from './dom/node'
-import { type VaporComponent, createComponent } from './component'
+import {
+  type VaporComponent,
+  type VaporComponentInstance,
+  createComponent,
+  mountComponent,
+  unmountComponent,
+} from './component'
 import {
   type AppMountFn,
   type AppUnmountFn,
@@ -17,12 +22,12 @@ const mountApp: AppMountFn<ParentNode> = (app, container) => {
     container.textContent = ''
   }
   const instance = createComponent(app._component, app._props as RawProps)
-  insert(instance, container)
+  mountComponent(instance, container)
   return instance
 }
 
 const unmountApp: AppUnmountFn = app => {
-  // TODO
+  unmountComponent(app._instance as VaporComponentInstance, app._container)
 }
 
 export const createVaporApp: CreateAppFunction<

+ 10 - 6
packages/runtime-vapor/src/component.ts

@@ -399,12 +399,12 @@ export function createComponentWithFallback(
 export function mountComponent(
   instance: VaporComponentInstance,
   parent: ParentNode,
-  anchor: Node | null | 0,
+  anchor?: Node | null | 0,
 ): void {
   if (!instance.isMounted) {
     if (instance.bm) invokeArrayFns(instance.bm)
     insert(instance.block, parent, anchor)
-    // queuePostFlushCb(() => {
+    // TODO queuePostFlushCb(() => {
     if (instance.m) invokeArrayFns(instance.m)
     instance.isMounted = true
     // })
@@ -415,7 +415,7 @@ export function mountComponent(
 
 export function unmountComponent(
   instance: VaporComponentInstance,
-  parent: ParentNode,
+  parent?: ParentNode,
 ): void {
   if (instance.isMounted && !instance.isUnmounted) {
     if (__DEV__ && instance.type.__hmrId) {
@@ -423,11 +423,15 @@ export function unmountComponent(
     }
     if (instance.bum) invokeArrayFns(instance.bum)
     instance.scope.stop()
-    // TODO invoke unmount recursively for children
-    remove(instance.block, parent)
-    // queuePostFlushCb(() => {
+    for (const c of instance.children) {
+      unmountComponent(c)
+    }
+    if (parent) remove(instance.block, parent)
+    // TODO queuePostFlushCb(() => {
     if (instance.um) invokeArrayFns(instance.um)
     instance.isUnmounted = true
     // })
+  } else if (parent) {
+    remove(instance.block, parent)
   }
 }