fix(ssr): respect render function from extends/mixins in ssr (#3006)
fix #3004
This commit is contained in:
parent
7fad69c260
commit
0a583d5ca2
@ -670,9 +670,13 @@ function finishComponentSetup(
|
|||||||
|
|
||||||
// template / render function normalization
|
// template / render function normalization
|
||||||
if (__NODE_JS__ && isSSR) {
|
if (__NODE_JS__ && isSSR) {
|
||||||
if (Component.render) {
|
// 1. the render function may already exist, returned by `setup`
|
||||||
instance.render = Component.render as InternalRenderFunction
|
// 2. otherwise try to use the `Component.render`
|
||||||
}
|
// 3. if the component doesn't have a render function,
|
||||||
|
// set `instance.render` to NOOP so that it can inherit the render function from mixins/extend
|
||||||
|
instance.render = (instance.render ||
|
||||||
|
Component.render ||
|
||||||
|
NOOP) as InternalRenderFunction
|
||||||
} else if (!instance.render) {
|
} else if (!instance.render) {
|
||||||
// could be set from setup()
|
// could be set from setup()
|
||||||
if (compile && Component.template && !Component.render) {
|
if (compile && Component.template && !Component.render) {
|
||||||
@ -711,7 +715,8 @@ function finishComponentSetup(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// warn missing template/render
|
// warn missing template/render
|
||||||
if (__DEV__ && !Component.render && instance.render === NOOP) {
|
// the runtime compilation of template in SSR is done by server-render
|
||||||
|
if (__DEV__ && !Component.render && instance.render === NOOP && !isSSR) {
|
||||||
/* istanbul ignore if */
|
/* istanbul ignore if */
|
||||||
if (!compile && Component.template) {
|
if (!compile && Component.template) {
|
||||||
warn(
|
warn(
|
||||||
|
@ -99,6 +99,46 @@ function testRender(type: string, render: typeof renderToString) {
|
|||||||
).toBe(`<div>hello</div>`)
|
).toBe(`<div>hello</div>`)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('components using defineComponent with extends option', async () => {
|
||||||
|
expect(
|
||||||
|
await render(
|
||||||
|
createApp(
|
||||||
|
defineComponent({
|
||||||
|
extends: {
|
||||||
|
data() {
|
||||||
|
return { msg: 'hello' }
|
||||||
|
},
|
||||||
|
render(this: any) {
|
||||||
|
return h('div', this.msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
)
|
||||||
|
)
|
||||||
|
).toBe(`<div>hello</div>`)
|
||||||
|
})
|
||||||
|
|
||||||
|
test('components using defineComponent with mixins option', async () => {
|
||||||
|
expect(
|
||||||
|
await render(
|
||||||
|
createApp(
|
||||||
|
defineComponent({
|
||||||
|
mixins: [
|
||||||
|
{
|
||||||
|
data() {
|
||||||
|
return { msg: 'hello' }
|
||||||
|
},
|
||||||
|
render(this: any) {
|
||||||
|
return h('div', this.msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
)
|
||||||
|
)
|
||||||
|
).toBe(`<div>hello</div>`)
|
||||||
|
})
|
||||||
|
|
||||||
test('optimized components', async () => {
|
test('optimized components', async () => {
|
||||||
expect(
|
expect(
|
||||||
await render(
|
await render(
|
||||||
|
@ -22,7 +22,8 @@ import {
|
|||||||
isString,
|
isString,
|
||||||
isVoidTag,
|
isVoidTag,
|
||||||
ShapeFlags,
|
ShapeFlags,
|
||||||
isArray
|
isArray,
|
||||||
|
NOOP
|
||||||
} from '@vue/shared'
|
} from '@vue/shared'
|
||||||
import { ssrRenderAttrs } from './helpers/ssrRenderAttrs'
|
import { ssrRenderAttrs } from './helpers/ssrRenderAttrs'
|
||||||
import { ssrCompile } from './helpers/ssrCompile'
|
import { ssrCompile } from './helpers/ssrCompile'
|
||||||
@ -118,7 +119,7 @@ function renderComponentSubTree(
|
|||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
if (
|
if (
|
||||||
!instance.render &&
|
(!instance.render || instance.render === NOOP) &&
|
||||||
!instance.ssrRender &&
|
!instance.ssrRender &&
|
||||||
!comp.ssrRender &&
|
!comp.ssrRender &&
|
||||||
isString(comp.template)
|
isString(comp.template)
|
||||||
@ -155,7 +156,7 @@ function renderComponentSubTree(
|
|||||||
instance.ctx
|
instance.ctx
|
||||||
)
|
)
|
||||||
setCurrentRenderingInstance(null)
|
setCurrentRenderingInstance(null)
|
||||||
} else if (instance.render) {
|
} else if (instance.render && instance.render !== NOOP) {
|
||||||
renderVNode(
|
renderVNode(
|
||||||
push,
|
push,
|
||||||
(instance.subTree = renderComponentRoot(instance)),
|
(instance.subTree = renderComponentRoot(instance)),
|
||||||
|
Loading…
Reference in New Issue
Block a user