mirror of https://github.com/vuejs/core.git
fix(ssr): properly init slots during ssr rendering (#12441)
close #12438
This commit is contained in:
parent
5e37dd0095
commit
2206cd235a
|
@ -806,7 +806,7 @@ export function setupComponent(
|
||||||
const { props, children } = instance.vnode
|
const { props, children } = instance.vnode
|
||||||
const isStateful = isStatefulComponent(instance)
|
const isStateful = isStatefulComponent(instance)
|
||||||
initProps(instance, props, isStateful, isSSR)
|
initProps(instance, props, isStateful, isSSR)
|
||||||
initSlots(instance, children, optimized)
|
initSlots(instance, children, optimized || isSSR)
|
||||||
|
|
||||||
const setupResult = isStateful
|
const setupResult = isStateful
|
||||||
? setupStatefulComponent(instance, isSSR)
|
? setupStatefulComponent(instance, isSSR)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { createApp } from 'vue'
|
import { createApp, defineAsyncComponent, h } from 'vue'
|
||||||
import { renderToString } from '../src/renderToString'
|
import { renderToString } from '../src/renderToString'
|
||||||
|
|
||||||
const components = {
|
const components = {
|
||||||
|
@ -154,6 +154,38 @@ describe('ssr: slot', () => {
|
||||||
).toBe(`<div><p>1</p><p>2</p></div>`)
|
).toBe(`<div><p>1</p><p>2</p></div>`)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// #12438
|
||||||
|
test('async component slot with v-if true', async () => {
|
||||||
|
const Layout = defineAsyncComponent(() =>
|
||||||
|
Promise.resolve({
|
||||||
|
template: `<div><slot name="header">default header</slot></div>`,
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
const LayoutLoader = {
|
||||||
|
setup(_: any, context: any) {
|
||||||
|
return () => h(Layout, {}, context.slots)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
expect(
|
||||||
|
await renderToString(
|
||||||
|
createApp({
|
||||||
|
components: {
|
||||||
|
LayoutLoader,
|
||||||
|
},
|
||||||
|
template: `
|
||||||
|
<Suspense>
|
||||||
|
<LayoutLoader>
|
||||||
|
<template v-if="true" #header>
|
||||||
|
new header
|
||||||
|
</template>
|
||||||
|
</LayoutLoader>
|
||||||
|
</Suspense>
|
||||||
|
`,
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
).toBe(`<div><!--[--> new header <!--]--></div>`)
|
||||||
|
})
|
||||||
|
|
||||||
// #11326
|
// #11326
|
||||||
test('dynamic component slot', async () => {
|
test('dynamic component slot', async () => {
|
||||||
expect(
|
expect(
|
||||||
|
|
Loading…
Reference in New Issue