From f61dd7223c5a6579fb881c64e6c3a98e2a222e34 Mon Sep 17 00:00:00 2001 From: defcc Date: Mon, 20 Mar 2017 01:10:54 +0800 Subject: [PATCH 1/4] fix SSR v-show bug. v-show info needs to be merged from parent to child component --- src/server/render.js | 28 ++++++++++++++++++++++++++-- test/ssr/ssr-string.spec.js | 27 +++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/src/server/render.js b/src/server/render.js index 7720c0172b4..bee3a0a9d63 100644 --- a/src/server/render.js +++ b/src/server/render.js @@ -144,6 +144,22 @@ function hasAncestorData (node: VNode) { return parentNode && (parentNode.data || hasAncestorData(parentNode)) } +function getVShowDirectiveInfo (node: VNode): ?VNodeDirective { + let dir: VNodeDirective + let tmp + + while (node) { + if (node.data && node.data.directives) { + tmp = node.data.directives.find(dir => dir.name === 'show') + if (tmp) { + dir = tmp + } + } + node = node.parent + } + return dir +} + function renderStartingTag (node: VNode, context) { let markup = `<${node.tag}` const { directives, modules } = context @@ -158,14 +174,22 @@ function renderStartingTag (node: VNode, context) { const dirs = node.data.directives if (dirs) { for (let i = 0; i < dirs.length; i++) { - const dirRenderer = directives[dirs[i].name] - if (dirRenderer) { + const name = dirs[i].name + const dirRenderer = directives[name] + if (dirRenderer && name !== 'show') { // directives mutate the node's data // which then gets rendered by modules dirRenderer(node, dirs[i]) } } } + + // v-show directive needs to be merged from parent to child + const showDirectiveInfo = getVShowDirectiveInfo(node) + if (showDirectiveInfo) { + directives.show(node, showDirectiveInfo) + } + // apply other modules for (let i = 0; i < modules.length; i++) { const res = modules[i](node) diff --git a/test/ssr/ssr-string.spec.js b/test/ssr/ssr-string.spec.js index 5dd3747c9e6..68baaa77927 100644 --- a/test/ssr/ssr-string.spec.js +++ b/test/ssr/ssr-string.spec.js @@ -240,6 +240,33 @@ describe('SSR: renderToString', () => { }) }) + it('v-show directive merging on components', done => { + renderVmWithOptions({ + template: ` + +
+ +
+
+ `, + components: { + foo: { + render: h => h('bar'), + components: { + bar: { + render: h => h('div', 'inner') + } + } + } + } + }, res => { + expect(res).toContain( + '
inner
' + ) + done() + }) + }) + it('text interpolation', done => { renderVmWithOptions({ template: '
{{ foo }} side {{ bar }}
', From a9ea643b5c899d16d685e46c18d987867f11193a Mon Sep 17 00:00:00 2001 From: defcc Date: Mon, 20 Mar 2017 01:12:14 +0800 Subject: [PATCH 2/4] improve variable name --- src/server/render.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/server/render.js b/src/server/render.js index bee3a0a9d63..e28fb63cebc 100644 --- a/src/server/render.js +++ b/src/server/render.js @@ -185,9 +185,9 @@ function renderStartingTag (node: VNode, context) { } // v-show directive needs to be merged from parent to child - const showDirectiveInfo = getVShowDirectiveInfo(node) - if (showDirectiveInfo) { - directives.show(node, showDirectiveInfo) + const vshowDirectiveInfo = getVShowDirectiveInfo(node) + if (vshowDirectiveInfo) { + directives.show(node, vshowDirectiveInfo) } // apply other modules From 51ae74124497d9ae7238b06eabd8ac20d1887b22 Mon Sep 17 00:00:00 2001 From: defcc Date: Mon, 20 Mar 2017 02:04:40 +0800 Subject: [PATCH 3/4] update test case --- test/ssr/ssr-string.spec.js | 63 ++++++++++++++++++++++++++++++++----- 1 file changed, 55 insertions(+), 8 deletions(-) diff --git a/test/ssr/ssr-string.spec.js b/test/ssr/ssr-string.spec.js index 68baaa77927..f0f2ab4b9b5 100644 --- a/test/ssr/ssr-string.spec.js +++ b/test/ssr/ssr-string.spec.js @@ -240,18 +240,65 @@ describe('SSR: renderToString', () => { }) }) + it('v-show directive render', done => { + renderVmWithOptions({ + template: '', + components: { + foo: { + render: h => h('div', 'inner') + } + } + }, res => { + expect(res).toContain( + '
inner
' + ) + done() + }) + }) + + it('v-show directive not passed to child', done => { + renderVmWithOptions({ + template: '', + components: { + foo: { + template: '
inner
' + } + } + }, res => { + expect(res).toContain( + '
inner
' + ) + done() + }) + }) + + it('v-show directive not passed to slot', done => { + renderVmWithOptions({ + template: 'inner', + components: { + foo: { + template: '
' + } + } + }, res => { + expect(res).toContain( + '
inner
' + ) + done() + }) + }) + it('v-show directive merging on components', done => { renderVmWithOptions({ - template: ` - -
- -
-
- `, + template: '', components: { foo: { - render: h => h('bar'), + render: h => h('bar', { + directives: [{ + name: 'show', + value: true + }] + }), components: { bar: { render: h => h('div', 'inner') From cb409e5da7685ab615d92e7fa4ab8cfeb83b71fa Mon Sep 17 00:00:00 2001 From: defcc Date: Mon, 20 Mar 2017 02:08:21 +0800 Subject: [PATCH 4/4] update test case --- test/ssr/ssr-string.spec.js | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/test/ssr/ssr-string.spec.js b/test/ssr/ssr-string.spec.js index f0f2ab4b9b5..efe885456dd 100644 --- a/test/ssr/ssr-string.spec.js +++ b/test/ssr/ssr-string.spec.js @@ -242,15 +242,10 @@ describe('SSR: renderToString', () => { it('v-show directive render', done => { renderVmWithOptions({ - template: '', - components: { - foo: { - render: h => h('div', 'inner') - } - } + template: '
inner
' }, res => { expect(res).toContain( - '
inner
' + '
inner
' ) done() })