diff --git a/packages/runtime-core/__tests__/apiOptions.spec.ts b/packages/runtime-core/__tests__/apiOptions.spec.ts
index 18207f61dc3..da5fe346c32 100644
--- a/packages/runtime-core/__tests__/apiOptions.spec.ts
+++ b/packages/runtime-core/__tests__/apiOptions.spec.ts
@@ -12,6 +12,7 @@ import {
createApp,
computed
} from '@vue/runtime-test'
+import { render as domRender } from 'vue'
describe('api: options', () => {
test('data', async () => {
@@ -1035,6 +1036,19 @@ describe('api: options', () => {
expect(renderToString(h(Comp))).toBe('base,base')
})
+ test('extends template', () => {
+ const Comp = {
+ extends: {
+ template: `
Foo
`
+ }
+ }
+
+ const root = document.createElement('div') as any
+ domRender(h(Comp), root)
+ expect(root.innerHTML).toBe(`Foo
`)
+ })
+
+
test('options defined in component have higher priority', async () => {
const Mixin = {
msg1: 'base'
diff --git a/packages/runtime-core/src/component.ts b/packages/runtime-core/src/component.ts
index eb933bb70fe..c70a6f87411 100644
--- a/packages/runtime-core/src/component.ts
+++ b/packages/runtime-core/src/component.ts
@@ -35,7 +35,8 @@ import {
applyOptions,
ComponentOptions,
ComputedOptions,
- MethodOptions
+ MethodOptions,
+ resolveMergedOptions
} from './componentOptions'
import {
EmitsOptions,
@@ -792,7 +793,8 @@ export function finishComponentSetup(
(__COMPAT__ &&
instance.vnode.props &&
instance.vnode.props['inline-template']) ||
- Component.template
+ Component.template ||
+ resolveMergedOptions(instance).template
if (template) {
if (__DEV__) {
startMeasure(instance, `compile`)