]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(ssr): properly init slots during ssr rendering (#12441)
authoredison <daiwei521@126.com>
Fri, 2 May 2025 09:48:03 +0000 (17:48 +0800)
committerGitHub <noreply@github.com>
Fri, 2 May 2025 09:48:03 +0000 (02:48 -0700)
close #12438

packages/runtime-core/src/component.ts
packages/server-renderer/__tests__/ssrSlot.spec.ts

index 3ed42ed0b55bec8c89976c6d010c878b7b196325..5b094a0d611dfcea00615cbceed901f1b2efa7c5 100644 (file)
@@ -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)
index 02872274ab60736940175deb199dc03bb25a018e..4cc7fd97ef2cd51609e85682a7a84535ee486d1a 100644 (file)
@@ -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(`<div><p>1</p><p>2</p></div>`)
   })
 
+  // #12438
+  test('async component slot with v-if true', async () => {
+    const Layout = defineAsyncComponent(() =>
+      Promise.resolve({
+        template: `<div><slot name="header">default header</slot></div>`,
+      }),
+    )
+    const LayoutLoader = {
+      setup(_: any, context: any) {
+        return () => h(Layout, {}, context.slots)
+      },
+    }
+    expect(
+      await renderToString(
+        createApp({
+          components: {
+            LayoutLoader,
+          },
+          template: `
+            <Suspense>
+              <LayoutLoader>
+                <template v-if="true" #header>
+                  new header
+                </template>
+              </LayoutLoader>
+            </Suspense>
+          `,
+        }),
+      ),
+    ).toBe(`<div><!--[--> new header <!--]--></div>`)
+  })
+
   // #11326
   test('dynamic component slot', async () => {
     expect(