wip: vapor app.unmount + unmounted hooks

This commit is contained in:
Evan You 2024-12-08 23:16:49 +08:00
parent ac5f1cfe3f
commit 366dcb7c76
No known key found for this signature in database
GPG Key ID: 00E9AB7A6704CE0A
2 changed files with 19 additions and 10 deletions

View File

@ -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<

View File

@ -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)
}
}