test: test nested suspense & nested async deps

This commit is contained in:
Evan You
2019-09-11 23:44:37 -04:00
parent bbc3442c52
commit b30b17d22d
4 changed files with 281 additions and 6 deletions

View File

@@ -1,4 +1,4 @@
import { VNode, VNodeChild } from './vnode'
import { VNode, VNodeChild, isVNode } from './vnode'
import { ReactiveEffect, reactive, readonly } from '@vue/reactivity'
import {
PublicInstanceProxyHandlers,
@@ -279,6 +279,12 @@ export function handleSetupResult(
// setup returned an inline render function
instance.render = setupResult as RenderFunction
} else if (isObject(setupResult)) {
if (__DEV__ && isVNode(setupResult)) {
warn(
`setup() should not return VNodes directly - ` +
`return a render function instead.`
)
}
// setup returned bindings.
// assuming a render function compiled from template is present.
instance.renderContext = reactive(setupResult)

View File

@@ -871,6 +871,7 @@ export function createRenderer<
hasUnresolvedAncestor = true
break
}
parent = parent.parent
}
// no pending parent suspense, flush all jobs
if (!hasUnresolvedAncestor) {
@@ -1509,7 +1510,14 @@ export function createRenderer<
return
}
if (__FEATURE_SUSPENSE__ && vnode.type === Suspense) {
move((vnode.suspense as any).subTree, container, anchor)
const suspense = vnode.suspense as SuspenseBoundary
move(
suspense.isResolved ? suspense.subTree : suspense.fallbackTree,
container,
anchor
)
suspense.container = container
// suspense.anchor = anchor
return
}
if (vnode.type === Fragment) {

View File

@@ -124,6 +124,12 @@ export function createBlock(
return vnode
}
const knownVNodes = new WeakSet<VNode>()
export function isVNode(value: any): boolean {
return knownVNodes.has(value)
}
export function createVNode(
type: VNodeTypes,
props: { [key: string]: any } | null | 0 = null,
@@ -198,6 +204,10 @@ export function createVNode(
trackDynamicNode(vnode)
}
if (__DEV__) {
knownVNodes.add(vnode)
}
return vnode
}