Skip to content

Commit 81d307a

Browse files
committed
refactor: use shared isAttrRenderable logic between ssr and hydration
1 parent 492a720 commit 81d307a

File tree

3 files changed

+23
-16
lines changed

3 files changed

+23
-16
lines changed

packages/runtime-core/src/hydration.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ import {
2121
isBooleanAttr,
2222
isKnownHtmlAttr,
2323
isKnownSvgAttr,
24-
isObject,
2524
isOn,
25+
isRenderableAttrValue,
2626
isReservedProp,
2727
isString,
2828
normalizeClass,
@@ -770,10 +770,9 @@ function propHasMismatch(
770770
} else {
771771
actual = false
772772
}
773-
expected =
774-
isObject(clientValue) || clientValue == null
775-
? false
776-
: String(clientValue)
773+
expected = isRenderableAttrValue(clientValue)
774+
? String(clientValue)
775+
: false
777776
}
778777
if (actual !== expected) {
779778
mismatchType = `attribute`

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

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
import { escapeHtml, isSVGTag, stringifyStyle } from '@vue/shared'
1+
import {
2+
escapeHtml,
3+
isRenderableAttrValue,
4+
isSVGTag,
5+
stringifyStyle,
6+
} from '@vue/shared'
27
import {
38
includeBooleanAttr,
49
isBooleanAttr,
@@ -47,7 +52,7 @@ export function ssrRenderDynamicAttr(
4752
value: unknown,
4853
tag?: string,
4954
): string {
50-
if (!isRenderableValue(value)) {
55+
if (!isRenderableAttrValue(value)) {
5156
return ``
5257
}
5358
const attrKey =
@@ -69,20 +74,12 @@ export function ssrRenderDynamicAttr(
6974
// Render a v-bind attr with static key. The key is pre-processed at compile
7075
// time and we only need to check and escape value.
7176
export function ssrRenderAttr(key: string, value: unknown): string {
72-
if (!isRenderableValue(value)) {
77+
if (!isRenderableAttrValue(value)) {
7378
return ``
7479
}
7580
return ` ${key}="${escapeHtml(value)}"`
7681
}
7782

78-
function isRenderableValue(value: unknown): boolean {
79-
if (value == null) {
80-
return false
81-
}
82-
const type = typeof value
83-
return type === 'string' || type === 'number' || type === 'boolean'
84-
}
85-
8683
export function ssrRenderClass(raw: unknown): string {
8784
return escapeHtml(normalizeClass(raw))
8885
}

packages/shared/src/domAttrConfig.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,3 +121,14 @@ export const isKnownSvgAttr = /*#__PURE__*/ makeMap(
121121
`xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,` +
122122
`xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`,
123123
)
124+
125+
/**
126+
* Shared between server-renderer and runtime-core hydration logic
127+
*/
128+
export function isRenderableAttrValue(value: unknown): boolean {
129+
if (value == null) {
130+
return false
131+
}
132+
const type = typeof value
133+
return type === 'string' || type === 'number' || type === 'boolean'
134+
}

0 commit comments

Comments
 (0)