From 366dcb7c76c64f78c8fb6dce1d41f1b8d45153e4 Mon Sep 17 00:00:00 2001 From: Evan You Date: Sun, 8 Dec 2024 23:16:49 +0800 Subject: [PATCH] wip: vapor app.unmount + unmounted hooks --- packages/runtime-vapor/src/apiCreateApp.ts | 13 +++++++++---- packages/runtime-vapor/src/component.ts | 16 ++++++++++------ 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/packages/runtime-vapor/src/apiCreateApp.ts b/packages/runtime-vapor/src/apiCreateApp.ts index 0611e5bd5..4a140cf10 100644 --- a/packages/runtime-vapor/src/apiCreateApp.ts +++ b/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 = (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< diff --git a/packages/runtime-vapor/src/component.ts b/packages/runtime-vapor/src/component.ts index 26dffd336..74c2fa2d3 100644 --- a/packages/runtime-vapor/src/component.ts +++ b/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) } }