mirror of https://github.com/vuejs/core.git
fix(compiler-ssr): ensure v-show has a higher priority in SSR (#12171)
close #12162
This commit is contained in:
parent
8620a616eb
commit
836b82976f
|
@ -11,9 +11,9 @@ describe('ssr: v-show', () => {
|
||||||
const { ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
|
const { ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
|
||||||
|
|
||||||
return function ssrRender(_ctx, _push, _parent, _attrs) {
|
return function ssrRender(_ctx, _push, _parent, _attrs) {
|
||||||
_push(\`<div\${_ssrRenderAttrs(_mergeProps({
|
_push(\`<div\${_ssrRenderAttrs(_mergeProps(_attrs, {
|
||||||
style: (_ctx.foo) ? null : { display: "none" }
|
style: (_ctx.foo) ? null : { display: "none" }
|
||||||
}, _attrs))}></div>\`)
|
}))}></div>\`)
|
||||||
}"
|
}"
|
||||||
`)
|
`)
|
||||||
})
|
})
|
||||||
|
@ -92,6 +92,24 @@ describe('ssr: v-show', () => {
|
||||||
`)
|
`)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('with style + display', () => {
|
||||||
|
expect(compileWithWrapper(`<div v-show="foo" style="display:flex" />`).code)
|
||||||
|
.toMatchInlineSnapshot(`
|
||||||
|
"const { ssrRenderStyle: _ssrRenderStyle, ssrRenderAttrs: _ssrRenderAttrs } = require("vue/server-renderer")
|
||||||
|
|
||||||
|
return function ssrRender(_ctx, _push, _parent, _attrs) {
|
||||||
|
_push(\`<div\${
|
||||||
|
_ssrRenderAttrs(_attrs)
|
||||||
|
}><div style="\${
|
||||||
|
_ssrRenderStyle([
|
||||||
|
{"display":"flex"},
|
||||||
|
(_ctx.foo) ? null : { display: "none" }
|
||||||
|
])
|
||||||
|
}"></div></div>\`)
|
||||||
|
}"
|
||||||
|
`)
|
||||||
|
})
|
||||||
|
|
||||||
test('with v-bind', () => {
|
test('with v-bind', () => {
|
||||||
expect(
|
expect(
|
||||||
compileWithWrapper(
|
compileWithWrapper(
|
||||||
|
|
|
@ -88,6 +88,17 @@ export const ssrTransformElement: NodeTransform = (node, context) => {
|
||||||
const hasCustomDir = node.props.some(
|
const hasCustomDir = node.props.some(
|
||||||
p => p.type === NodeTypes.DIRECTIVE && !isBuiltInDirective(p.name),
|
p => p.type === NodeTypes.DIRECTIVE && !isBuiltInDirective(p.name),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// v-show has a higher priority in ssr
|
||||||
|
const vShowPropIndex = node.props.findIndex(
|
||||||
|
i => i.type === NodeTypes.DIRECTIVE && i.name === 'show',
|
||||||
|
)
|
||||||
|
if (vShowPropIndex !== -1) {
|
||||||
|
const vShowProp = node.props[vShowPropIndex]
|
||||||
|
node.props.splice(vShowPropIndex, 1)
|
||||||
|
node.props.push(vShowProp)
|
||||||
|
}
|
||||||
|
|
||||||
const needMergeProps = hasDynamicVBind || hasCustomDir
|
const needMergeProps = hasDynamicVBind || hasCustomDir
|
||||||
if (needMergeProps) {
|
if (needMergeProps) {
|
||||||
const { props, directives } = buildProps(
|
const { props, directives } = buildProps(
|
||||||
|
|
Loading…
Reference in New Issue