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`)