From: Evan You Date: Mon, 9 Sep 2019 21:24:42 +0000 (-0400) Subject: test: basic test for suspense X-Git-Tag: v3.0.0-alpha.0~796 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=bd15138ef579437a9787e48b7cf0d6e69f780bf1;p=thirdparty%2Fvuejs%2Fcore.git test: basic test for suspense --- diff --git a/packages/runtime-core/__tests__/rendererSuspense.spec.ts b/packages/runtime-core/__tests__/rendererSuspense.spec.ts new file mode 100644 index 0000000000..6f7e2d2d6d --- /dev/null +++ b/packages/runtime-core/__tests__/rendererSuspense.spec.ts @@ -0,0 +1,64 @@ +import { + h, + ref, + Suspense, + ComponentOptions, + render, + nodeOps, + serializeInner, + nextTick +} from '@vue/runtime-test' + +describe('renderer: suspense', () => { + it('should work', async () => { + const msg = ref('hello') + const deps: Promise[] = [] + + const createAsyncComponent = (loader: () => Promise) => ({ + async setup(props: any, { slots }: any) { + const p = loader() + deps.push(p) + const Inner = await p + return () => h(Inner, props, slots) + } + }) + + const AsyncChild = createAsyncComponent( + () => + new Promise(resolve => { + setTimeout(() => { + resolve({ + setup(props: { msg: string }) { + return () => h('div', props.msg) + } + }) + }, 0) + }) + ) + + const Mid = { + setup() { + return () => + h(AsyncChild, { + msg: msg.value + }) + } + } + + const Comp = { + name: 'root', + setup() { + // TODO test fallback + return () => h(Suspense, [msg.value, h(Mid)]) + } + } + + const root = nodeOps.createElement('div') + render(h(Comp), root) + expect(serializeInner(root)).toBe(``) + + await Promise.all(deps) + await nextTick() + expect(serializeInner(root)).toBe(`hello
hello
`) + }) +}) diff --git a/packages/runtime-core/src/createRenderer.ts b/packages/runtime-core/src/createRenderer.ts index fb404feb0e..45ba646b1e 100644 --- a/packages/runtime-core/src/createRenderer.ts +++ b/packages/runtime-core/src/createRenderer.ts @@ -634,10 +634,10 @@ export function createRenderer< }) suspense.onResolve(() => { + // unmount fallback tree + unmount(suspense.fallbackTree as HostVNode, parentComponent, true) // move content from off-dom container to actual container - ;(suspense.subTree as any).children.forEach((vnode: HostVNode) => { - move(vnode, container, anchor) - }) + move(suspense.subTree as HostVNode, container, anchor) suspense.vnode.el = (suspense.subTree as HostVNode).el // check if there is a pending parent suspense let parent = suspense.parent @@ -682,7 +682,12 @@ export function createRenderer< // now check if we have encountered any async deps if (suspense.deps > 0) { // TODO mount the fallback tree. - console.log('fallback') + processEmptyNode( + null, + (suspense.fallbackTree = createVNode(Empty)), + container, + anchor + ) } else { suspense.resolve() } @@ -815,6 +820,10 @@ export function createRenderer< suspense.deps-- suspense.retry() }) + // give it a placeholder + const placeholder = (instance.subTree = createVNode(Empty)) + processEmptyNode(null, placeholder, container, anchor) + initialVNode.el = placeholder.el return }