From 5d97dcab1d0d8c52219ba1467506d86502ed7883 Mon Sep 17 00:00:00 2001 From: taylorliu Date: Mon, 11 Mar 2019 13:27:05 +0800 Subject: [PATCH 1/2] fix(ssr): fix nested async functional componet rendering --- .../vdom/helpers/resolve-async-component.js | 4 +-- test/ssr/ssr-string.spec.js | 35 +++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/core/vdom/helpers/resolve-async-component.js b/src/core/vdom/helpers/resolve-async-component.js index fa76090553c..9e6e936ea13 100644 --- a/src/core/vdom/helpers/resolve-async-component.js +++ b/src/core/vdom/helpers/resolve-async-component.js @@ -53,7 +53,7 @@ export function resolveAsyncComponent ( } const owner = currentRenderingInstance - if (isDef(factory.owners) && factory.owners.indexOf(owner) === -1) { + if (isDef(factory.owners) && factory.owners.indexOf(owner) === -1 && owner) { // already pending factory.owners.push(owner) } @@ -62,7 +62,7 @@ export function resolveAsyncComponent ( return factory.loadingComp } - if (!isDef(factory.owners)) { + if (!isDef(factory.owners) && owner) { const owners = factory.owners = [owner] let sync = true diff --git a/test/ssr/ssr-string.spec.js b/test/ssr/ssr-string.spec.js index 19bc4005419..e18ca2aead9 100644 --- a/test/ssr/ssr-string.spec.js +++ b/test/ssr/ssr-string.spec.js @@ -640,6 +640,41 @@ describe('SSR: renderToString', () => { }) }) + it('renders nested async functional component', done => { + renderVmWithOptions({ + template: ` +
+ +
+ `, + components: { + outerAsync (resolve) { + setTimeout(() => resolve({ + functional: true, + render (h) { + return h('innerAsync') + } + }), 1) + }, + innerAsync (resolve) { + setTimeout(() => resolve({ + functional: true, + render (h) { + return h('span', { class: ['a'] }, 'inner') + }, + }), 1) + } + } + }, result => { + expect(result).toContain( + '
' + + 'inner' + + '
' + ) + done() + }) + }) + it('should catch async component error', done => { Vue.config.silent = true renderToString(new Vue({ From 635bbdef831dac66255f5d50500996d6436a46c9 Mon Sep 17 00:00:00 2001 From: Evan You Date: Wed, 13 Mar 2019 17:20:00 +0800 Subject: [PATCH 2/2] Update resolve-async-component.js --- src/core/vdom/helpers/resolve-async-component.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/vdom/helpers/resolve-async-component.js b/src/core/vdom/helpers/resolve-async-component.js index 9e6e936ea13..534c444f2a2 100644 --- a/src/core/vdom/helpers/resolve-async-component.js +++ b/src/core/vdom/helpers/resolve-async-component.js @@ -53,7 +53,7 @@ export function resolveAsyncComponent ( } const owner = currentRenderingInstance - if (isDef(factory.owners) && factory.owners.indexOf(owner) === -1 && owner) { + if (owner && isDef(factory.owners) && factory.owners.indexOf(owner) === -1) { // already pending factory.owners.push(owner) } @@ -62,7 +62,7 @@ export function resolveAsyncComponent ( return factory.loadingComp } - if (!isDef(factory.owners) && owner) { + if (owner && !isDef(factory.owners)) { const owners = factory.owners = [owner] let sync = true