From 98b83e86d16c635547a1e735e5fb675aea2f0f1b Mon Sep 17 00:00:00 2001 From: edison Date: Mon, 19 Aug 2024 16:22:05 +0800 Subject: [PATCH] fix(ssr): apply ssr props to the the fallback vnode-based branch in ssr (#7247) close #6123 --- .../__tests__/ssrDynamicComponent.spec.ts | 19 ++++++++++++++++++- packages/server-renderer/src/render.ts | 12 ++++++------ 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/packages/server-renderer/__tests__/ssrDynamicComponent.spec.ts b/packages/server-renderer/__tests__/ssrDynamicComponent.spec.ts index caeb88397b1..0679c82168b 100644 --- a/packages/server-renderer/__tests__/ssrDynamicComponent.spec.ts +++ b/packages/server-renderer/__tests__/ssrDynamicComponent.spec.ts @@ -1,5 +1,5 @@ import { createApp, createVNode } from 'vue' -import { renderToString } from '../src/renderToString' +import { renderToString } from '../src' describe('ssr: dynamic component', () => { test('resolved to component', async () => { @@ -17,6 +17,23 @@ describe('ssr: dynamic component', () => { ).toBe(`
slot
`) }) + test('resolved to component with v-show', async () => { + expect( + await renderToString( + createApp({ + components: { + one: { + template: ``, + }, + }, + template: `hi`, + }), + ), + ).toBe( + `
hi
`, + ) + }) + test('resolve to element', async () => { expect( await renderToString( diff --git a/packages/server-renderer/src/render.ts b/packages/server-renderer/src/render.ts index be51da1b86d..4744940e827 100644 --- a/packages/server-renderer/src/render.ts +++ b/packages/server-renderer/src/render.ts @@ -217,7 +217,11 @@ export function renderVNode( parentComponent: ComponentInternalInstance, slotScopeId?: string, ): void { - const { type, shapeFlag, children } = vnode + const { type, shapeFlag, children, dirs, props } = vnode + if (dirs) { + vnode.props = applySSRDirectives(vnode, props, dirs) + } + switch (type) { case Text: push(escapeHtml(children as string)) @@ -283,13 +287,9 @@ function renderElementVNode( slotScopeId?: string, ) { const tag = vnode.type as string - let { props, children, shapeFlag, scopeId, dirs } = vnode + let { props, children, shapeFlag, scopeId } = vnode let openTag = `<${tag}` - if (dirs) { - props = applySSRDirectives(vnode, props, dirs) - } - if (props) { openTag += ssrRenderAttrs(props, tag) }