From: edison Date: Fri, 2 May 2025 09:48:03 +0000 (+0800) Subject: fix(ssr): properly init slots during ssr rendering (#12441) X-Git-Tag: v3.5.14~14 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2206cd235a1627c540e795e378b7564a55b47313;p=thirdparty%2Fvuejs%2Fcore.git fix(ssr): properly init slots during ssr rendering (#12441) close #12438 --- diff --git a/packages/runtime-core/src/component.ts b/packages/runtime-core/src/component.ts index 3ed42ed0b5..5b094a0d61 100644 --- a/packages/runtime-core/src/component.ts +++ b/packages/runtime-core/src/component.ts @@ -806,7 +806,7 @@ export function setupComponent( const { props, children } = instance.vnode const isStateful = isStatefulComponent(instance) initProps(instance, props, isStateful, isSSR) - initSlots(instance, children, optimized) + initSlots(instance, children, optimized || isSSR) const setupResult = isStateful ? setupStatefulComponent(instance, isSSR) diff --git a/packages/server-renderer/__tests__/ssrSlot.spec.ts b/packages/server-renderer/__tests__/ssrSlot.spec.ts index 02872274ab..4cc7fd97ef 100644 --- a/packages/server-renderer/__tests__/ssrSlot.spec.ts +++ b/packages/server-renderer/__tests__/ssrSlot.spec.ts @@ -1,4 +1,4 @@ -import { createApp } from 'vue' +import { createApp, defineAsyncComponent, h } from 'vue' import { renderToString } from '../src/renderToString' const components = { @@ -154,6 +154,38 @@ describe('ssr: slot', () => { ).toBe(`

1

2

`) }) + // #12438 + test('async component slot with v-if true', async () => { + const Layout = defineAsyncComponent(() => + Promise.resolve({ + template: `
default header
`, + }), + ) + const LayoutLoader = { + setup(_: any, context: any) { + return () => h(Layout, {}, context.slots) + }, + } + expect( + await renderToString( + createApp({ + components: { + LayoutLoader, + }, + template: ` + + + + + + `, + }), + ), + ).toBe(`
new header
`) + }) + // #11326 test('dynamic component slot', async () => { expect(