Skip to content

Commit

Permalink
fix(ssr): fix the bug that multi slot scope id does not work on compo…
Browse files Browse the repository at this point in the history
…nent (#6100)

close #6093
  • Loading branch information
mmis1000 committed May 30, 2024
1 parent b9ca202 commit 4c74302
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 1 deletion.
90 changes: 90 additions & 0 deletions packages/server-renderer/__tests__/ssrScopeId.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -179,4 +179,94 @@ describe('ssr: scopedId runtime behavior', () => {
const result = await renderToString(createApp(Comp)) // output: `<div></div>`
expect(result).toBe(`<div parent></div>`)
})

// #6093
test(':slotted on forwarded slots on component', async () => {
const Wrapper = {
__scopeId: 'wrapper',
ssrRender: (ctx: any, push: any, parent: any, attrs: any) => {
// <div class="wrapper"><slot/></div>
push(
`<div${ssrRenderAttrs(
mergeProps({ class: 'wrapper' }, attrs),
)} wrapper>`,
)
ssrRenderSlot(
ctx.$slots,
'default',
{},
null,
push,
parent,
'wrapper-s',
)
push(`</div>`)
},
}

const Slotted = {
__scopeId: 'slotted',
ssrRender: (ctx: any, push: any, parent: any, attrs: any) => {
// <Wrapper><slot/></Wrapper>
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(`<div${ssrRenderAttrs(attrs)}></div>`)
},
}

const Root = {
__scopeId: 'root',
// <Slotted><Child></Child></Slotted>
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(
`<div class="wrapper" root slotted wrapper>` +
`<!--[--><!--[--><div root slotted-s wrapper-s></div><!--]--><!--]-->` +
`</div>`,
)
})
})
5 changes: 4 additions & 1 deletion packages/server-renderer/src/render.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 4c74302

Please sign in to comment.