import {
+ type ComponentInternalInstance,
type ComponentOptions,
type ConcreteComponent,
type GenericComponentInstance,
import type { ComponentRenderContext } from '../componentPublicInstance'
import { devtoolsComponentAdded } from '../devtools'
import { isAsyncWrapper } from '../apiAsyncComponent'
-import { isSuspense } from './Suspense'
+import { type SuspenseBoundary, isSuspense } from './Suspense'
import { LifecycleHooks } from '../enums'
type MatchPattern = string | RegExp | (string | RegExp)[]
const parentSuspense = keepAliveInstance.suspense
+ const { renderer } = sharedContext
const {
- renderer: {
- p: patch,
- m: move,
- um: _unmount,
- o: { createElement },
- },
- } = sharedContext
+ um: _unmount,
+ o: { createElement },
+ } = renderer
const storageContainer = createElement('div')
sharedContext.activate = (
namespace,
optimized,
) => {
- const instance = vnode.component!
- move(
+ activate(
vnode,
container,
anchor,
- MoveType.ENTER,
+ renderer,
keepAliveInstance,
parentSuspense,
- )
- // in case props have changed
- patch(
- instance.vnode,
- vnode,
- container,
- anchor,
- instance,
- parentSuspense,
namespace,
- vnode.slotScopeIds,
optimized,
)
- queuePostRenderEffect(() => {
- instance.isDeactivated = false
- if (instance.a) {
- invokeArrayFns(instance.a)
- }
- const vnodeHook = vnode.props && vnode.props.onVnodeMounted
- if (vnodeHook) {
- invokeVNodeHook(vnodeHook, instance.parent, vnode)
- }
- }, parentSuspense)
-
- if (__DEV__ || __FEATURE_PROD_DEVTOOLS__) {
- // Update components tree
- devtoolsComponentAdded(instance)
- }
}
sharedContext.deactivate = (vnode: VNode) => {
- const instance = vnode.component!
- invalidateMount(instance.m)
- invalidateMount(instance.a)
-
- move(
+ deactivate(
vnode,
storageContainer,
- null,
- MoveType.LEAVE,
+ renderer,
keepAliveInstance,
parentSuspense,
)
- queuePostRenderEffect(() => {
- if (instance.da) {
- invokeArrayFns(instance.da)
- }
- const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted
- if (vnodeHook) {
- invokeVNodeHook(vnodeHook, instance.parent, vnode)
- }
- instance.isDeactivated = true
- }, parentSuspense)
-
- if (__DEV__ || __FEATURE_PROD_DEVTOOLS__) {
- // Update components tree
- devtoolsComponentAdded(instance)
- }
}
function unmount(vnode: VNode) {
function getInnerChild(vnode: VNode) {
return vnode.shapeFlag & ShapeFlags.SUSPENSE ? vnode.ssContent! : vnode
}
+
+/**
+ * shared between runtime-core and runtime-vapor
+ */
+export function activate(
+ vnode: VNode,
+ container: RendererElement,
+ anchor: RendererNode | null,
+ { p: patch, m: move }: RendererInternals,
+ parentComponent: ComponentInternalInstance | null,
+ parentSuspense: SuspenseBoundary | null,
+ namespace?: ElementNamespace,
+ optimized?: boolean,
+): void {
+ const instance = vnode.component!
+ move(
+ vnode,
+ container,
+ anchor,
+ MoveType.ENTER,
+ parentComponent,
+ parentSuspense,
+ )
+ // in case props have changed
+ patch(
+ instance.vnode,
+ vnode,
+ container,
+ anchor,
+ instance,
+ parentSuspense,
+ namespace,
+ vnode.slotScopeIds,
+ optimized,
+ )
+ queuePostRenderEffect(() => {
+ instance.isDeactivated = false
+ if (instance.a) {
+ invokeArrayFns(instance.a)
+ }
+ const vnodeHook = vnode.props && vnode.props.onVnodeMounted
+ if (vnodeHook) {
+ invokeVNodeHook(vnodeHook, instance.parent, vnode)
+ }
+ }, parentSuspense)
+
+ if (__DEV__ || __FEATURE_PROD_DEVTOOLS__) {
+ // Update components tree
+ devtoolsComponentAdded(instance)
+ }
+}
+
+/**
+ * shared between runtime-core and runtime-vapor
+ */
+export function deactivate(
+ vnode: VNode,
+ container: RendererElement,
+ { m: move }: RendererInternals,
+ parentComponent: ComponentInternalInstance | null,
+ parentSuspense: SuspenseBoundary | null,
+): void {
+ const instance = vnode.component!
+ invalidateMount(instance.m)
+ invalidateMount(instance.a)
+
+ move(vnode, container, null, MoveType.LEAVE, parentComponent, parentSuspense)
+ queuePostRenderEffect(() => {
+ if (instance.da) {
+ invokeArrayFns(instance.da)
+ }
+ const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted
+ if (vnodeHook) {
+ invokeVNodeHook(vnodeHook, instance.parent, vnode)
+ }
+ instance.isDeactivated = true
+ }, parentSuspense)
+
+ if (__DEV__ || __FEATURE_PROD_DEVTOOLS__) {
+ // Update components tree
+ devtoolsComponentAdded(instance)
+ }
+}
export interface KeepAliveInstance extends VaporComponentInstance {
activate: (
- block: VaporComponentInstance | VaporFragment,
+ instance: VaporComponentInstance,
parentNode: ParentNode,
anchor?: Node | null | 0,
) => void
- deactivate: (block: VaporComponentInstance | VaporFragment) => void
+ deactivate: (instance: VaporComponentInstance) => void
process: (block: Block) => void
getCachedComponent: (
comp: VaporComponent,
) => VaporComponentInstance | VaporFragment | undefined
+ getStorageContainer: () => ParentNode
}
type CacheKey = VaporComponent
})
})
+ keepAliveInstance.getStorageContainer = () => storageContainer
keepAliveInstance.getCachedComponent = comp => cache.get(comp)
const process = (keepAliveInstance.process = block => {
}
})
- keepAliveInstance.activate = (block, parentNode, anchor) => {
- current = block
- let instance
- if (isVaporComponent(block)) {
- instance = block
- insert(block.block, parentNode, anchor)
- } else {
- // vdom interop
- const comp = block.nodes as any
- insert(comp.el, parentNode, anchor)
- instance = comp.component
- }
+ keepAliveInstance.activate = (instance, parentNode, anchor) => {
+ current = instance
+ insert(instance.block, parentNode, anchor)
queuePostFlushCb(() => {
instance.isDeactivated = false
}
}
- keepAliveInstance.deactivate = block => {
- let instance
- if (isVaporComponent(block)) {
- instance = block
- insert(block.block, storageContainer)
- } else {
- // vdom interop
- const comp = block.nodes as any
- insert(comp.el, storageContainer)
- instance = comp.component
- }
+ keepAliveInstance.deactivate = instance => {
+ insert(instance.block, storageContainer)
queuePostFlushCb(() => {
if (instance.da) invokeArrayFns(instance.da)