Skip to content

Commit

Permalink
fix(ssr): avoid rendering transition-group slot content as a fragment (
Browse files Browse the repository at this point in the history
  • Loading branch information
edison1105 authored Jan 3, 2024
1 parent 25f212d commit 0160264
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 1 deletion.
16 changes: 16 additions & 0 deletions packages/server-renderer/__tests__/ssrSlot.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -137,4 +137,20 @@ describe('ssr: slot', () => {
),
).toBe(`<div>foo</div>`)
})

// #9933
test('transition-group slot', async () => {
expect(
await renderToString(
createApp({
components: {
one: {
template: `<TransitionGroup tag="div"><slot/></TransitionGroup>`,
},
},
template: `<one><p v-for="i in 2">{{i}}</p></one>`,
}),
),
).toBe(`<div><p>1</p><p>2</p></div>`)
})
})
18 changes: 17 additions & 1 deletion packages/server-renderer/src/helpers/ssrRenderSlot.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,23 @@ export function ssrRenderSlotInner(
fallbackRenderFn()
}
} else {
for (let i = 0; i < slotBuffer.length; i++) {
// #9933
// Although we handle Transition/TransitionGroup in the transform stage
// without rendering it as a fragment, the content passed into the slot
// may still be a fragment.
// Therefore, here we need to avoid rendering it as a fragment again.
let start = 0
let end = slotBuffer.length
if (
transition &&
slotBuffer[0] === '<!--[-->' &&
slotBuffer[end - 1] === '<!--]-->'
) {
start++
end--
}

for (let i = start; i < end; i++) {
push(slotBuffer[i])
}
}
Expand Down

0 comments on commit 0160264

Please sign in to comment.