我们可以通过 getCurrentInstance 这个函数来返回当前组件的实例对象,也就是当前 vue 这个实例对象,下面这篇文章主要给大家介绍了关于 Vue3 组合式 API 之 getCurrentInstance 的相关资料,需要的朋友可以参考下

Vue2 中,可以通过 this 来获取当前组件实例;

Vue3 中,在 setup 中无法通过 this 获取组件实例,console.log (this) 打印出来的值是 undefined。

在 Vue3 中,getCurrentInstance () 可以用来获取当前组件实例 vue3 官方文档解释

let { proxy } = getCurrentInstance();

在 setup 中分别打印下面 3 个值,结果如下:

console.log(getCurrentInstance, typeof(getCurrentInstance)); 
console.log(getCurrentInstance(), typeof(getCurrentInstance()));
console.log(proxy, typeo(proxy));

img

可以看到,getCurrentInstance 是一个 function 方法,getCurrentInstance () 是一个对象,proxy 也是一个对象。proxy 是 getCurrentInstance () 对象中的一个属性,通过对象的解构赋值方式拿到 proxy。

getCurrentInstance 只能在 setup生命周期钩子中使用。

1. 在 onMunted 生命周期中打印 getCurrentInstance

2. 定义一个 test 方法,通过 click 事件触发方法

onMounted(() => { 
    console.log(getCurrentInstance(), typeof getCurrentInstance());
});
function test() { 
    console.log(getCurrentInstance(), typeof getCurrentInstance());
}

img

可以看到在 function 中是无法获取该实例的。

let { ctx } = getCurrentInstance();
console.log(ctx, typeof ctx);
let { proxy } = getCurrentInstance();
console.log(proxy, typeof proxy);

img

ctx 和 proxy 都是 getCurrentInstance () 对象中的属性,通过解构赋值的方式拿到。可以看到,2 者有所区别。ctx 是普通对象,proxy 是 Proxy 对象。

补充:Vue3 中关于 getCurrentInstance 的大坑

开发中只适用于调试! 不要用于线上环境,否则会有问题!

解决方案:

方案 1.

// main.ts
// 注册全军变量
app.config.globalProperties.$message = 'Hello lxl'
const instance = getCurrentInstance()
console.log(instance.appContext.config.globalProperties.$message)

获取挂载到全局中的方法

方案 2.

const { proxy } = getCurrentInstance() 
console.log(proxy.$message)

使用 proxy 线上也不会出现问题

备注:

  • getCurrentInstance: 获取挂载在全局的属性
  • ComponentPublicInstance: 获取上下文
  • ComponentCustomProperties: 组件公共实例