如何在 Vue 自定义指令中添加事件监听器?

Posted

技术标签:

【中文标题】如何在 Vue 自定义指令中添加事件监听器?【英文标题】:How can i add event listener in Vue customized directive? 【发布时间】:2017-05-11 07:39:46 【问题描述】:

我正在使用 Vue2.x,我想通过自定义指令添加事件监听器,但是在 vue1.x 中我可以使用以下代码 sn-p:

Vue.directive('demo',
  bind () 
    let self  = this
    this.event = function (event) 
      self.vm.$emit(self.expression, event)
    
    this.el.addEventListener('click', this.stopProp)
    document.body.addEventListener('click', this.event)
  
)

但是在 vue2.x 中,我发现 'this' 总是未定义,我无法弄清楚如何获取 vm (Vue Instance) 对象。我已经在documentation 上尝试了所有传递的参数列表。

有人知道如何访问 vm 对象吗?

【问题讨论】:

【参考方案1】:

有一些不同之处,您可以在this CodePen 上看到完整的、工作的 sn-p 示例(尽管稍作调整),但我会在这里详细说明:

您对this 的引用无效,因为在指令的上下文中this 指的是window。而不是这些参考:

this.event = ...
// ...
self.vm.$emit()
// ...
self.expression

您应该使用传递给bind() 的三个参数:

    el - DOM 元素 binding - 指令元数据的绑定对象,包括 expression vnode - VNode 对象 - 它的 context 属性是 Vue 实例

有了这些,上面的三行将对应:

el.event = ...
// ...
vnode.context.$emit()
// ..
binding.expression

最后,附注:您的事件侦听器不会导致任何事情发生,因为您单击元素会触发 stopProp 函数(从您的 sn-p 中排除),该函数可能会调用 stopPropagation() 但随后您尝试在body 上捕获传播的事件。

【讨论】:

我只是尝试将 click-outside 事件添加到 div。就像这个问题 [***.com/questions/36170425/… click outside element)。但我发现 $emit 回调不起作用。无论如何我找到了vue-clickaway project.非常感谢。

以上是关于如何在 Vue 自定义指令中添加事件监听器?的主要内容,如果未能解决你的问题,请参考以下文章

自定义vue点击事件传递数据

Vue之自定义按键及指令

vue 全局自定义指令注册

vue3.2 setup 之局部自定义指令

vue3.2 setup 之局部自定义指令

vue3自定义指令详解