|
|
@@ -18,7 +18,6 @@ import {
|
|
|
invokeArrayFns
|
|
|
} from '@vue/shared'
|
|
|
import { watch } from '../apiWatch'
|
|
|
-import { SuspenseBoundary } from './Suspense'
|
|
|
import {
|
|
|
RendererInternals,
|
|
|
queuePostRenderEffect,
|
|
|
@@ -27,6 +26,7 @@ import {
|
|
|
RendererNode
|
|
|
} from '../renderer'
|
|
|
import { setTransitionHooks } from './BaseTransition'
|
|
|
+import { ComponentPublicProxyTarget } from '../componentProxy'
|
|
|
|
|
|
type MatchPattern = string | RegExp | string[] | RegExp[]
|
|
|
|
|
|
@@ -40,9 +40,8 @@ type CacheKey = string | number | Component
|
|
|
type Cache = Map<CacheKey, VNode>
|
|
|
type Keys = Set<CacheKey>
|
|
|
|
|
|
-export interface KeepAliveSink {
|
|
|
+export interface KeepAliveContext extends ComponentPublicProxyTarget {
|
|
|
renderer: RendererInternals
|
|
|
- parentSuspense: SuspenseBoundary | null
|
|
|
activate: (
|
|
|
vnode: VNode,
|
|
|
container: RendererElement,
|
|
|
@@ -76,25 +75,25 @@ const KeepAliveImpl = {
|
|
|
let current: VNode | null = null
|
|
|
|
|
|
const instance = getCurrentInstance()!
|
|
|
+ const parentSuspense = instance.suspense
|
|
|
|
|
|
- // KeepAlive communicates with the instantiated renderer via the "sink"
|
|
|
- // where the renderer passes in platform-specific functions, and the
|
|
|
- // KeepAlive instance exposes activate/deactivate implementations.
|
|
|
+ // KeepAlive communicates with the instantiated renderer via the proxyTarget
|
|
|
+ // as a shared context where the renderer passes in its internals,
|
|
|
+ // and the KeepAlive instance exposes activate/deactivate implementations.
|
|
|
// The whole point of this is to avoid importing KeepAlive directly in the
|
|
|
// renderer to facilitate tree-shaking.
|
|
|
- const sink = instance.sink as KeepAliveSink
|
|
|
+ const sharedContext = instance.proxyTarget as KeepAliveContext
|
|
|
const {
|
|
|
renderer: {
|
|
|
p: patch,
|
|
|
m: move,
|
|
|
um: _unmount,
|
|
|
o: { createElement }
|
|
|
- },
|
|
|
- parentSuspense
|
|
|
- } = sink
|
|
|
+ }
|
|
|
+ } = sharedContext
|
|
|
const storageContainer = createElement('div')
|
|
|
|
|
|
- sink.activate = (vnode, container, anchor, isSVG, optimized) => {
|
|
|
+ sharedContext.activate = (vnode, container, anchor, isSVG, optimized) => {
|
|
|
const child = vnode.component!
|
|
|
move(vnode, container, anchor, MoveType.ENTER, parentSuspense)
|
|
|
// in case props have changed
|
|
|
@@ -116,7 +115,7 @@ const KeepAliveImpl = {
|
|
|
}, parentSuspense)
|
|
|
}
|
|
|
|
|
|
- sink.deactivate = (vnode: VNode) => {
|
|
|
+ sharedContext.deactivate = (vnode: VNode) => {
|
|
|
move(vnode, storageContainer, null, MoveType.LEAVE, parentSuspense)
|
|
|
queuePostRenderEffect(() => {
|
|
|
const component = vnode.component!
|