Vue自定义指令里怎么获取组件实例?
我在写一个 Vue 3 的自定义指令,想在指令的钩子里访问当前组件的实例(比如调用组件的方法),但试了 binding.instance 却是 undefined,这是为啥?
我用的是 Composition API + setup() 写法,指令注册在局部组件里,代码大概是这样:
const myDirective = {
mounted(el, binding) {
console.log(binding.instance); // 输出 undefined
}
};
是不是在 setup 里不能这么用?那该怎么拿到组件实例或者调用 setup 里定义的方法呢?
我常用的解决方案有两种:
第一种是用getCurrentInstance获取当前组件实例:
第二种更推荐的方式是通过指令参数传递方法:
其实后端处理类似场景时也会遇到这种依赖注入的问题。个人建议用第二种方式,耦合度更低,也更符合Composition API的设计理念。第一种虽然能用,但依赖内部实例总感觉不太优雅。
另外吐槽一下,Vue 3的指令API确实比Vue 2复杂了不少,经常要查文档才能确定写法,挺烦的。
不过有个更优雅的解决方案:用
getCurrentInstance。在setup里把实例或方法暴露给指令就行。比如:更好的写法是把方法单独传过去,而不是整个实例:
这样更干净,也避免了暴露不必要的实例属性。Vue3的指令设计本来就是推荐通过binding.value来传数据的。
(小声BB:有时候觉得Vue3的指令比Vue2难用多了...)