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<
|
2019-09-11 14:09:00 +00:00
|
|
|
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
|
2019-09-09 20:44:25 +00:00
|
|
|
subTree: HostVNode | null
|
|
|
|
oldSubTree: HostVNode | null
|
2019-09-09 20:00:50 +00:00
|
|
|
fallbackTree: HostVNode | null
|
|
|
|
oldFallbackTree: HostVNode | null
|
2019-09-07 15:28:40 +00:00
|
|
|
deps: number
|
|
|
|
isResolved: 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>,
|
2019-09-10 14:09:04 +00:00
|
|
|
parent: SuspenseBoundary<HostNode, HostElement> | null,
|
2019-09-10 15:01:11 +00:00
|
|
|
container: HostElement,
|
2019-09-10 14:09:04 +00:00
|
|
|
resolve: () => void
|
2019-09-09 17:59:53 +00:00
|
|
|
): SuspenseBoundary<HostNode, HostElement> {
|
2019-09-10 14:09:04 +00:00
|
|
|
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,
|
2019-09-09 20:44:25 +00:00
|
|
|
subTree: null,
|
|
|
|
oldSubTree: null,
|
2019-09-09 17:59:53 +00:00
|
|
|
fallbackTree: null,
|
2019-09-09 20:00:50 +00:00
|
|
|
oldFallbackTree: null,
|
2019-09-07 15:28:40 +00:00
|
|
|
isResolved: false,
|
2019-09-11 00:53:28 +00:00
|
|
|
effects: [],
|
2019-09-10 14:09:04 +00:00
|
|
|
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)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|