diff --git a/packages/runtime-core/__tests__/apiExpose.spec.ts b/packages/runtime-core/__tests__/apiExpose.spec.ts index 9f7ba535031..1235096b016 100644 --- a/packages/runtime-core/__tests__/apiExpose.spec.ts +++ b/packages/runtime-core/__tests__/apiExpose.spec.ts @@ -1,4 +1,4 @@ -import { nodeOps, render } from '@vue/runtime-test' +import { createApp, nodeOps, render } from '@vue/runtime-test' import { defineComponent, h, ref } from '../src' describe('api: expose', () => { @@ -170,6 +170,26 @@ describe('api: expose', () => { render(h(Parent), root) }) + test('with mount', () => { + const Component = defineComponent({ + setup(_, { expose }) { + expose({ + foo: 1 + }) + return { + bar: 2 + } + }, + render() { + return h('div') + } + }) + const root = nodeOps.createElement('div') + const vm = createApp(Component).mount(root) as any + expect(vm.foo).toBe(1) + expect(vm.bar).toBe(undefined) + }) + test('expose should allow access to built-in instance properties', () => { const GrandChild = defineComponent({ render() { diff --git a/packages/runtime-core/src/apiCreateApp.ts b/packages/runtime-core/src/apiCreateApp.ts index 3e438107da0..b77c90c3448 100644 --- a/packages/runtime-core/src/apiCreateApp.ts +++ b/packages/runtime-core/src/apiCreateApp.ts @@ -3,7 +3,8 @@ import { Data, validateComponentName, Component, - ComponentInternalInstance + ComponentInternalInstance, + getExposeProxy } from './component' import { ComponentOptions, @@ -309,7 +310,7 @@ export function createAppAPI( devtoolsInitApp(app, version) } - return vnode.component!.proxy + return getExposeProxy(vnode.component!) || vnode.component!.proxy } else if (__DEV__) { warn( `App has already been mounted.\n` +