vue3-yuanma/packages/runtime-core/src/suspense.ts

64 lines
1.6 KiB
TypeScript
Raw Normal View History

2019-09-10 15:01:11 +00:00
import { VNode, normalizeVNode } from './vnode'
import { ShapeFlags } from '.'
2019-09-10 15:17:26 +00:00
import { isFunction } from '@vue/shared'
2019-09-07 15:28:40 +00:00
export const SuspenseSymbol = __DEV__ ? Symbol('Suspense key') : Symbol()
2019-09-09 20:00:50 +00:00
export interface SuspenseBoundary<
HostNode = any,
HostElement = any,
2019-09-09 20:00:50 +00:00
HostVNode = VNode<HostNode, HostElement>
> {
vnode: HostVNode
2019-09-09 17:59:53 +00:00
parent: SuspenseBoundary<HostNode, HostElement> | null
2019-09-10 15:01:11 +00:00
container: HostElement
subTree: HostVNode
fallbackTree: HostVNode
2019-09-07 15:28:40 +00:00
deps: number
isResolved: boolean
isUnmounted: boolean
2019-09-11 00:53:28 +00:00
effects: Function[]
2019-09-07 15:28:40 +00:00
resolve(): void
}
2019-09-09 17:59:53 +00:00
export function createSuspenseBoundary<HostNode, HostElement>(
2019-09-09 20:00:50 +00:00
vnode: VNode<HostNode, HostElement>,
parent: SuspenseBoundary<HostNode, HostElement> | null,
2019-09-10 15:01:11 +00:00
container: HostElement,
resolve: () => void
2019-09-09 17:59:53 +00:00
): SuspenseBoundary<HostNode, HostElement> {
return {
2019-09-09 20:00:50 +00:00
vnode,
2019-09-09 17:59:53 +00:00
parent,
2019-09-10 15:01:11 +00:00
container,
2019-09-07 15:28:40 +00:00
deps: 0,
subTree: null as any, // will be set immediately after creation
fallbackTree: null as any, // will be set immediately after creation
2019-09-07 15:28:40 +00:00
isResolved: false,
isUnmounted: false,
2019-09-11 00:53:28 +00:00
effects: [],
resolve
2019-09-07 15:28:40 +00:00
}
}
2019-09-10 15:01:11 +00:00
export function normalizeSuspenseChildren(
vnode: VNode
): {
content: VNode
fallback: VNode
} {
2019-09-10 15:17:26 +00:00
const { shapeFlag, children } = vnode
2019-09-10 15:01:11 +00:00
if (shapeFlag & ShapeFlags.SLOTS_CHILDREN) {
2019-09-10 15:17:26 +00:00
const { default: d, fallback } = children as any
2019-09-10 15:01:11 +00:00
return {
2019-09-10 15:17:26 +00:00
content: normalizeVNode(isFunction(d) ? d() : d),
fallback: normalizeVNode(isFunction(fallback) ? fallback() : fallback)
2019-09-10 15:01:11 +00:00
}
} else {
return {
2019-09-10 15:17:26 +00:00
content: normalizeVNode(children as any),
2019-09-10 15:01:11 +00:00
fallback: normalizeVNode(null)
}
}
}