Skip to content

Commit e733e5c

Browse files
defccyyx990803
authored andcommitted
fix SSR v-show render. (vuejs#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

src/server/render.js

Lines changed: 26 additions & 2 deletions
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)

test/ssr/ssr-string.spec.js

Lines changed: 69 additions & 0 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy