// template / render function normalization
if (__NODE_JS__ && isSSR) {
- if (Component.render) {
- instance.render = Component.render as InternalRenderFunction
- }
+ // 1. the render function may already exist, returned by `setup`
+ // 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) {
// could be set from setup()
if (compile && Component.template && !Component.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 */
if (!compile && Component.template) {
warn(
).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 () => {
expect(
await render(
isString,
isVoidTag,
ShapeFlags,
- isArray
+ isArray,
+ NOOP
} from '@vue/shared'
import { ssrRenderAttrs } from './helpers/ssrRenderAttrs'
import { ssrCompile } from './helpers/ssrCompile'
)
} else {
if (
- !instance.render &&
+ (!instance.render || instance.render === NOOP) &&
!instance.ssrRender &&
!comp.ssrRender &&
isString(comp.template)
instance.ctx
)
setCurrentRenderingInstance(null)
- } else if (instance.render) {
+ } else if (instance.render && instance.render !== NOOP) {
renderVNode(
push,
(instance.subTree = renderComponentRoot(instance)),