diff --git a/packages/server-renderer/__tests__/ssrScopeId.spec.ts b/packages/server-renderer/__tests__/ssrScopeId.spec.ts
index f9d356065d0..4ceb865fb50 100644
--- a/packages/server-renderer/__tests__/ssrScopeId.spec.ts
+++ b/packages/server-renderer/__tests__/ssrScopeId.spec.ts
@@ -179,4 +179,94 @@ describe('ssr: scopedId runtime behavior', () => {
const result = await renderToString(createApp(Comp)) // output: `
`
expect(result).toBe(``)
})
+
+ // #6093
+ test(':slotted on forwarded slots on component', async () => {
+ const Wrapper = {
+ __scopeId: 'wrapper',
+ ssrRender: (ctx: any, push: any, parent: any, attrs: any) => {
+ //
+ push(
+ ``,
+ )
+ ssrRenderSlot(
+ ctx.$slots,
+ 'default',
+ {},
+ null,
+ push,
+ parent,
+ 'wrapper-s',
+ )
+ push(`
`)
+ },
+ }
+
+ const Slotted = {
+ __scopeId: 'slotted',
+ ssrRender: (ctx: any, push: any, parent: any, attrs: any) => {
+ //
+ push(
+ ssrRenderComponent(
+ Wrapper,
+ attrs,
+ {
+ default: withCtx(
+ (_: any, push: any, parent: any, scopeId: string) => {
+ ssrRenderSlot(
+ ctx.$slots,
+ 'default',
+ {},
+ null,
+ push,
+ parent,
+ 'slotted-s' + scopeId,
+ )
+ },
+ ),
+ _: 1,
+ } as any,
+ parent,
+ ),
+ )
+ },
+ }
+
+ const Child = {
+ ssrRender: (ctx: any, push: any, parent: any, attrs: any) => {
+ push(``)
+ },
+ }
+
+ const Root = {
+ __scopeId: 'root',
+ //
+ ssrRender: (_: any, push: any, parent: any, attrs: any) => {
+ push(
+ ssrRenderComponent(
+ Slotted,
+ attrs,
+ {
+ default: withCtx(
+ (_: any, push: any, parent: any, scopeId: string) => {
+ push(ssrRenderComponent(Child, null, null, parent, scopeId))
+ },
+ ),
+ _: 1,
+ } as any,
+ parent,
+ ),
+ )
+ },
+ }
+
+ const result = await renderToString(createApp(Root))
+ expect(result).toBe(
+ ``,
+ )
+ })
})
diff --git a/packages/server-renderer/src/render.ts b/packages/server-renderer/src/render.ts
index 28a78c66843..7e274c3b981 100644
--- a/packages/server-renderer/src/render.ts
+++ b/packages/server-renderer/src/render.ts
@@ -181,7 +181,10 @@ function renderComponentSubTree(
if (slotScopeId) {
if (!hasCloned) attrs = { ...attrs }
- attrs![slotScopeId.trim()] = ''
+ const slotScopeIdList = slotScopeId.trim().split(' ')
+ for (let i = 0; i < slotScopeIdList.length; i++) {
+ attrs![slotScopeIdList[i]] = ''
+ }
}
// set current rendering instance for asset resolution