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