This commit is contained in:
edison 2025-06-24 13:16:57 -06:00 committed by GitHub
commit 05375883ff
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 125 additions and 8 deletions

View File

@ -1677,6 +1677,35 @@ describe('SSR hydration', () => {
expect(`mismatch`).not.toHaveBeenWarned()
})
// #13394
test('transition appear work with empty content', async () => {
const show = ref(true)
const { vnode, container } = mountWithHydration(
`<template><!----></template>`,
function (this: any) {
return h(
Transition,
{ appear: true },
{
default: () =>
show.value
? renderSlot(this.$slots, 'default')
: createTextVNode('foo'),
},
)
},
)
// empty slot render as a comment node
expect(container.firstChild!.nodeType).toBe(Node.COMMENT_NODE)
expect(vnode.el).toBe(container.firstChild)
expect(`mismatch`).not.toHaveBeenWarned()
show.value = false
await nextTick()
expect(container.innerHTML).toBe('foo')
})
test('transition appear with v-if', () => {
const show = false
const { vnode, container } = mountWithHydration(

View File

@ -111,26 +111,106 @@ describe('ssr: slot', () => {
})
test('transition slot', async () => {
const ReusableTransition = {
template: `<transition><slot/></transition>`,
}
const ReusableTransitionWithAppear = {
template: `<transition appear><slot/></transition>`,
}
expect(
await renderToString(
createApp({
components: {
one: {
template: `<transition><slot/></transition>`,
},
one: ReusableTransition,
},
template: `<one><div v-if="false">foo</div></one>`,
}),
),
).toBe(`<!---->`)
expect(await renderToString(createApp(ReusableTransition))).toBe(`<!---->`)
expect(await renderToString(createApp(ReusableTransitionWithAppear))).toBe(
`<template><!----></template>`,
)
expect(
await renderToString(
createApp({
components: {
one: ReusableTransition,
},
template: `<one><slot/></one>`,
}),
),
).toBe(`<!---->`)
expect(
await renderToString(
createApp({
components: {
one: {
template: `<transition><slot/></transition>`,
},
one: ReusableTransitionWithAppear,
},
template: `<one><slot/></one>`,
}),
),
).toBe(`<template><!----></template>`)
expect(
await renderToString(
createApp({
render() {
return h(ReusableTransition, null, {
default: () => null,
})
},
}),
),
).toBe(`<!---->`)
expect(
await renderToString(
createApp({
render() {
return h(ReusableTransitionWithAppear, null, {
default: () => null,
})
},
}),
),
).toBe(`<template><!----></template>`)
expect(
await renderToString(
createApp({
render() {
return h(ReusableTransitionWithAppear, null, {
default: () => [],
})
},
}),
),
).toBe(`<template><!----></template>`)
expect(
await renderToString(
createApp({
render() {
return h(ReusableTransition, null, {
default: () => [],
})
},
}),
),
).toBe(`<!---->`)
expect(
await renderToString(
createApp({
components: {
one: ReusableTransition,
},
template: `<one><div v-if="true">foo</div></one>`,
}),

View File

@ -74,6 +74,8 @@ export function ssrRenderSlotInner(
)
} else if (fallbackRenderFn) {
fallbackRenderFn()
} else if (transition) {
push(`<!---->`)
}
} else {
// ssr slot.
@ -110,13 +112,19 @@ export function ssrRenderSlotInner(
end--
}
for (let i = start; i < end; i++) {
push(slotBuffer[i])
if (start < end) {
for (let i = start; i < end; i++) {
push(slotBuffer[i])
}
} else if (transition) {
push(`<!---->`)
}
}
}
} else if (fallbackRenderFn) {
fallbackRenderFn()
} else if (transition) {
push(`<!---->`)
}
}