-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,
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<
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
// })
export function unmountComponent(
instance: VaporComponentInstance,
- parent: ParentNode,
+ parent?: ParentNode,
): void {
if (instance.isMounted && !instance.isUnmounted) {
if (__DEV__ && instance.type.__hmrId) {
}
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)
}
}