Vue自定义指令怎么获取组件实例?
我在写一个 Vue 3 的自定义指令,想在 directive 的钩子里拿到当前组件的实例(也就是 this 或 setup 里的东西),但发现 bind 或 mounted 钩子里的参数好像没有直接给出来。试过 el.__vue__ 也不行,控制台还报 undefined。
比如下面这个指令,我想在 inserted 里调用组件的一个方法:
const myDirective = {
mounted(el, binding, vnode) {
// 这里怎么拿到组件实例?vnode.component 拿到的是 VNodeComponent,但没找到公开的方法
console.log(vnode);
}
}
是不是只能通过 binding.value 传进来?还是有别的办法?
vnode.context或者el.__vue__都不太好使了。拿到组件实例其实很简单,用
binding.instance就行:binding.instance就是指令所属的组件实例,跟你在组件里用this拿到的是同一个东西。如果你想用
vnode.component也不是不行,Vue 3.2+ 的话是vnode.component.proxy,之前版本是vnode.componentInstance,但明显没有直接用binding.instance方便。至于你试的
el.__vue__,这确实是 Vue 2 的老黄历了,Vue 3 里早没了。另外提醒一下,
binding.instance在unmounted钩子里可能已经变成 null 或者不对了,用的时候注意下时序问题。vnode.component.proxy就能拿到组件实例,和 Vue 2 的 this 是一样的:如果你的指令是写在 setup 里的,Vue 3.2+ 还有更省事的写法——用
mounted(el, binding, vnode, ...args) { args[0] },不过vnode.component.proxy最稳。