Skip to content

介绍

getCurrentInstance 是 Vue 3.0 新增的 API,用于获取当前组件实例。在 Vue 2.x 中,我们可以通过 this 来获取当前组件实例,但是在 Vue 3.0 中,this 不再指向当前组件实例,而是指向 undefined

使用

typescript
import { getProxy } from '@/utils/getCurrentInstance'

const proxy = getProxy()

proxy.$something

实现

当你使用键入 proxy. 后 IDE 会提示所有的属性和方法,这是因为 getProxy 函数返回的是 ComponentPublicInstance 类型。函数实现如下:

typescript
import { ComponentInternalInstance, ComponentPublicInstance, getCurrentInstance } from 'vue'

// 获取当前组件实例
export const getInstance = (): ComponentInternalInstance => {
  const instance = getCurrentInstance() as ComponentInternalInstance
  if (!instance) {
    throw new Error('instance is undefined')
  }
  return instance
}

// 获取当前组件实例的代理
export const getProxy = (): ComponentPublicInstance => {
  const { proxy } = getInstance()
  if (!proxy) {
    throw new Error('proxy is undefined')
  }
  return proxy
}

上面的代码中,我们指定了 getProxy 函数的返回值为 ComponentPublicInstance 类型并处理了 getInstance().proxynull 的情况,这样就可以在使用 proxy 时获得正确的提示。

提示

当你在 src/main.ts 注册全局属性时,IDE不会提示你的全局属性。

typescript
......
app.config.globalProperties.$custom = custom
......

解决方法是在 src/vue.d.ts 中声明全局属性:

typescript
declare module '@vue/runtime-core' {
  interface ComponentCustomProperties {
    ......
    $custom: custom
  }
}

由 Tang 用 ❤️ 构建