Skip to content

Commit e733e5c

Browse files
defccyyx990803
authored andcommitted
fix SSR v-show render. (#5224)
* fix SSR v-show bug. v-show info needs to be merged from parent to child component * improve variable name * update test case * update test case
1 parent 84856a3 commit e733e5c

File tree

2 files changed

+95
-2
lines changed

2 files changed

+95
-2
lines changed

Diff for: src/server/render.js

+26-2
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,22 @@ function hasAncestorData (node: VNode) {
144144
return parentNode && (parentNode.data || hasAncestorData(parentNode))
145145
}
146146

147+
function getVShowDirectiveInfo (node: VNode): ?VNodeDirective {
148+
let dir: VNodeDirective
149+
let tmp
150+
151+
while (node) {
152+
if (node.data && node.data.directives) {
153+
tmp = node.data.directives.find(dir => dir.name === 'show')
154+
if (tmp) {
155+
dir = tmp
156+
}
157+
}
158+
node = node.parent
159+
}
160+
return dir
161+
}
162+
147163
function renderStartingTag (node: VNode, context) {
148164
let markup = `<${node.tag}`
149165
const { directives, modules } = context
@@ -158,14 +174,22 @@ function renderStartingTag (node: VNode, context) {
158174
const dirs = node.data.directives
159175
if (dirs) {
160176
for (let i = 0; i < dirs.length; i++) {
161-
const dirRenderer = directives[dirs[i].name]
162-
if (dirRenderer) {
177+
const name = dirs[i].name
178+
const dirRenderer = directives[name]
179+
if (dirRenderer && name !== 'show') {
163180
// directives mutate the node's data
164181
// which then gets rendered by modules
165182
dirRenderer(node, dirs[i])
166183
}
167184
}
168185
}
186+
187+
// v-show directive needs to be merged from parent to child
188+
const vshowDirectiveInfo = getVShowDirectiveInfo(node)
189+
if (vshowDirectiveInfo) {
190+
directives.show(node, vshowDirectiveInfo)
191+
}
192+
169193
// apply other modules
170194
for (let i = 0; i < modules.length; i++) {
171195
const res = modules[i](node)

Diff for: test/ssr/ssr-string.spec.js

+69
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,75 @@ describe('SSR: renderToString', () => {
240240
})
241241
})
242242

243+
it('v-show directive render', done => {
244+
renderVmWithOptions({
245+
template: '<div v-show="false"><span>inner</span></div>'
246+
}, res => {
247+
expect(res).toContain(
248+
'<div server-rendered="true" style="display:none;"><span>inner</span></div>'
249+
)
250+
done()
251+
})
252+
})
253+
254+
it('v-show directive not passed to child', done => {
255+
renderVmWithOptions({
256+
template: '<foo v-show="false"></foo>',
257+
components: {
258+
foo: {
259+
template: '<div><span>inner</span></div>'
260+
}
261+
}
262+
}, res => {
263+
expect(res).toContain(
264+
'<div server-rendered="true" style="display:none;"><span>inner</span></div>'
265+
)
266+
done()
267+
})
268+
})
269+
270+
it('v-show directive not passed to slot', done => {
271+
renderVmWithOptions({
272+
template: '<foo v-show="false"><span>inner</span></foo>',
273+
components: {
274+
foo: {
275+
template: '<div><slot></slot></div>'
276+
}
277+
}
278+
}, res => {
279+
expect(res).toContain(
280+
'<div server-rendered="true" style="display:none;"><span>inner</span></div>'
281+
)
282+
done()
283+
})
284+
})
285+
286+
it('v-show directive merging on components', done => {
287+
renderVmWithOptions({
288+
template: '<foo v-show="false"></foo>',
289+
components: {
290+
foo: {
291+
render: h => h('bar', {
292+
directives: [{
293+
name: 'show',
294+
value: true
295+
}]
296+
}),
297+
components: {
298+
bar: {
299+
render: h => h('div', 'inner')
300+
}
301+
}
302+
}
303+
}
304+
}, res => {
305+
expect(res).toContain(
306+
'<div server-rendered="true" style="display:none;">inner</div>'
307+
)
308+
done()
309+
})
310+
})
311+
243312
it('text interpolation', done => {
244313
renderVmWithOptions({
245314
template: '<div>{{ foo }} side {{ bar }}</div>',

0 commit comments

Comments
 (0)