Skip to content

Commit 65d55b3

Browse files
committed
fix(ssr): add support for overloaded boolean attributes
1 parent 897116d commit 65d55b3

File tree

4 files changed

+22
-10
lines changed

4 files changed

+22
-10
lines changed

packages/compiler-ssr/__tests__/ssrElement.spec.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,20 @@ describe('ssr: element', () => {
191191
`)
192192
})
193193

194+
test('v-bind:arg (overloaded boolean)', () => {
195+
expect(
196+
getCompiledString(
197+
`<div><span :hidden="false"></span><span :hidden="'until-found'"></span></div>`,
198+
),
199+
).toMatchInlineSnapshot(`
200+
"\`<div><span\${
201+
_ssrRenderDynamicAttr("hidden", false)
202+
}></span><span\${
203+
_ssrRenderDynamicAttr("hidden", 'until-found')
204+
}></span></div>\`"
205+
`)
206+
})
207+
194208
test('v-bind:[arg]', () => {
195209
expect(getCompiledString(`<div v-bind:[key]="value"></div>`))
196210
.toMatchInlineSnapshot(`

packages/compiler-ssr/src/transforms/ssrTransformElement.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import {
3838
escapeHtml,
3939
isBooleanAttr,
4040
isBuiltInDirective,
41+
isOverloadedBooleanAttr,
4142
isSSRSafeAttrName,
4243
propsToAttrMap,
4344
} from '@vue/shared'
@@ -287,6 +288,13 @@ export const ssrTransformElement: NodeTransform = (node, context) => {
287288
false /* no newline */,
288289
),
289290
)
291+
} else if (isOverloadedBooleanAttr(attrName)) {
292+
openTag.push(
293+
createCallExpression(
294+
context.helper(SSR_RENDER_DYNAMIC_ATTR),
295+
[key, value],
296+
),
297+
)
290298
} else if (isSSRSafeAttrName(attrName)) {
291299
openTag.push(
292300
createCallExpression(context.helper(SSR_RENDER_ATTR), [

packages/server-renderer/__tests__/ssrRenderAttrs.spec.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -131,13 +131,6 @@ describe('ssr: renderAttr', () => {
131131
` foo="${escapeHtml(`<script>`)}"`,
132132
)
133133
})
134-
135-
test('combined boolean/string attribute', () => {
136-
expect(ssrRenderAttr('hidden', true)).toBe(` hidden`)
137-
expect(ssrRenderAttr('hidden', false)).toBe('')
138-
expect(ssrRenderAttr('hidden', 'until-found')).toBe(` hidden="until-found"`)
139-
expect(ssrRenderAttr('hidden', '')).toBe(` hidden`)
140-
})
141134
})
142135

143136
describe('ssr: renderClass', () => {

packages/server-renderer/src/helpers/ssrRenderAttrs.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,6 @@ export function ssrRenderAttr(key: string, value: unknown): string {
8484
if (!isRenderableAttrValue(value)) {
8585
return ``
8686
}
87-
if (isOverloadedBooleanAttr(key) && isBooleanAttrValue(value)) {
88-
return includeBooleanAttr(value) ? ` ${key}` : ``
89-
}
9087
return ` ${key}="${escapeHtml(value)}"`
9188
}
9289

0 commit comments

Comments
 (0)