【发布时间】:2022-10-06 19:48:48
【问题描述】:
我创建了一个指令,我需要使该指令调用一个存在于具有该指令的组件内的函数。
// Component with directive, this component has the method \'setDisabled()\'
<v-button v-can:edit.disable=\"[something]\" @click=\"add\" />
// Directive created
const can = {
mounted: async (el, binding, vnode) => {
let hasAccess = validateAccess()
if (!hasAccess) {
// should call v-button setDisabled() in here
}
},
}
在 VUE 2 中,这可以通过使用 vnode.context 来实现,但在 VUE 3 中,我似乎只能使用 binding.instance 从父组件访问方法。
那么,有没有办法在组件挂载之后使用el、binding或者vnode来调用方法呢?到目前为止,只看到了 vnode 中的道具,没有方法或反应数据。
-
\"来自父组件的方法\" - 不正确。 binding.instance 是当前实例,正如预期的那样。如果您对此有疑问,请考虑解决它。它非常特定于组件,但您通常会问。是 Vuetify 吗?那你可以先验证一下是否真的有这样的方法
-
\'v-button\' 是一个自定义组件。是的,\'binding.instance\' 正在返回在其模板中具有 v-button 的组件的实例。我正在尝试从具有指令的 \'v-button\' 访问方法
-
该指令是为 DOM 操作目的而设计的。如果你想调用组件的方法,为什么不传递一个 prop 并基于该 prop 调用组件内部的方法呢?引用该组件的另一种方法是在其父级中使用
ref。当您不想操作 DOM 时,根本不需要使用指令 -
@Duannx 这个想法是有一个指令,当该方法存在时,该指令可以在组件内部调用该方法。由于该指令是在挂载的钩子上触发的,因此所有方法都可以使用了。使用道具会强制重新渲染组件,这似乎是不必要的。我尝试使用 REF,但我需要设置 ref 并将其传递到指令中以实现此目的。拥有访问组件方法的指令不需要所有这些。
-
如果您的组件状态依赖于一个道具,那么重新渲染是必要的。这是 Vue 处理响应式数据的方式。我想说的重点是在指令中调用组件方法是一种意想不到的方式。它看起来很干净,但可能会导致一些副作用并且难以维护。我建议不要使用它
标签: vue.js vuejs3 vue-directives