From: Gianthard-cyh <45843411+Gianthard-cyh@users.noreply.github.com> Date: Mon, 19 Jan 2026 00:51:14 +0000 (+0800) Subject: fix(ssr): handle v-bind modifiers during render attrs (#14263) X-Git-Tag: v3.5.27~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c2f5964c47890321cab40fcf0ebc528e6d00337f;p=thirdparty%2Fvuejs%2Fcore.git fix(ssr): handle v-bind modifiers during render attrs (#14263) close #14262 --- diff --git a/packages/server-renderer/__tests__/render.spec.ts b/packages/server-renderer/__tests__/render.spec.ts index d0a5223b2f..e0136cb5c9 100644 --- a/packages/server-renderer/__tests__/render.spec.ts +++ b/packages/server-renderer/__tests__/render.spec.ts @@ -1229,5 +1229,23 @@ function testRender(type: string, render: typeof renderToString) { // during the render phase expect(getterSpy).toHaveBeenCalledTimes(2) }) + + test('props modifiers in render attrs', async () => { + const app = createApp({ + setup() { + return () => + h( + 'div', + { + '^attr': 'attr', + '.prop': 'prop', + }, + 'Functional Component', + ) + }, + }) + const html = await render(app) + expect(html).toBe(`
Functional Component
`) + }) }) } diff --git a/packages/server-renderer/src/helpers/ssrRenderAttrs.ts b/packages/server-renderer/src/helpers/ssrRenderAttrs.ts index 903a9c9b3d..4d4bad4a1f 100644 --- a/packages/server-renderer/src/helpers/ssrRenderAttrs.ts +++ b/packages/server-renderer/src/helpers/ssrRenderAttrs.ts @@ -29,15 +29,19 @@ export function ssrRenderAttrs( tag?: string, ): string { let ret = '' - for (const key in props) { + for (let key in props) { if ( shouldIgnoreProp(key) || isOn(key) || - (tag === 'textarea' && key === 'value') + (tag === 'textarea' && key === 'value') || + // force as property (not rendered in SSR) + key.startsWith('.') ) { continue } const value = props[key] + // force as attribute + if (key.startsWith('^')) key = key.slice(1) if (key === 'class' || key === 'className') { ret += ` class="${ssrRenderClass(value)}"` } else if (key === 'style') {