From: Evan You Date: Wed, 5 Feb 2020 20:21:20 +0000 (-0500) Subject: wip(ssr): should only render renderable values X-Git-Tag: v3.0.0-alpha.5~103 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ae929250118424010fddd2b438d0489b4d2124fa;p=thirdparty%2Fvuejs%2Fcore.git wip(ssr): should only render renderable values --- diff --git a/packages/server-renderer/__tests__/renderAttrs.spec.ts b/packages/server-renderer/__tests__/renderAttrs.spec.ts index 54ac2cea0c..69d966b647 100644 --- a/packages/server-renderer/__tests__/renderAttrs.spec.ts +++ b/packages/server-renderer/__tests__/renderAttrs.spec.ts @@ -53,6 +53,16 @@ describe('ssr: renderAttrs', () => { ).toBe(` foo="false"`) // non boolean should render `false` as is }) + test('ingore non-renderable values', () => { + expect( + renderAttrs({ + foo: {}, + bar: [], + baz: () => {} + }) + ).toBe(``) + }) + test('props to attrs', () => { expect( renderAttrs({ diff --git a/packages/server-renderer/src/helpers/renderAttrs.ts b/packages/server-renderer/src/helpers/renderAttrs.ts index eaeb9e9bd1..237b08082b 100644 --- a/packages/server-renderer/src/helpers/renderAttrs.ts +++ b/packages/server-renderer/src/helpers/renderAttrs.ts @@ -45,7 +45,7 @@ export function renderDynamicAttr( value: unknown, tag?: string ): string { - if (value == null) { + if (!isRenderableValue(value)) { return `` } const attrKey = @@ -64,12 +64,20 @@ export function renderDynamicAttr( // Render a v-bind attr with static key. The key is pre-processed at compile // time and we only need to check and escape value. export function renderAttr(key: string, value: unknown): string { - if (value == null) { + if (!isRenderableValue(value)) { return `` } return ` ${key}="${escapeHtml(value)}"` } +function isRenderableValue(value: unknown): boolean { + if (value == null) { + return false + } + const type = typeof value + return type === 'string' || type === 'number' || type === 'boolean' +} + export function renderClass(raw: unknown): string { return escapeHtml(normalizeClass(raw)) }