Просмотр исходного кода

fix(runtime-core): return the exposeProxy from mount (#4606)

skirtle 4 лет назад
Родитель
Сommit
5aa4255808

+ 21 - 1
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() {

+ 3 - 2
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<HostElement>(
             devtoolsInitApp(app, version)
           }
 
-          return vnode.component!.proxy
+          return getExposeProxy(vnode.component!) || vnode.component!.proxy
         } else if (__DEV__) {
           warn(
             `App has already been mounted.\n` +