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(
})
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: {
- template: `<transition><slot/></transition>`,
- },
+ one: ReusableTransition,
+ },
+ template: `<one><slot/></one>`,
+ }),
+ ),
+ ).toBe(`<!---->`)
+
+ expect(
+ await renderToString(
+ createApp({
+ components: {
+ 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>`,
}),
)
} else if (fallbackRenderFn) {
fallbackRenderFn()
+ } else if (transition) {
+ push(`<!---->`)
}
} else {
// ssr slot.
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(`<!---->`)
}
}