首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Vue自定义指令中添加事件侦听器?

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

Stack Overflow用户
提问于 2016-12-27 01:47:59
回答 1查看 6.7K关注 0票数 1

我使用的是Vue2.x,我想通过使用自定义指令来添加一个事件侦听器,但是在vue1.x中,我可以使用以下代码片段:

代码语言:javascript
复制
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实例)对象。我已经尝试过文档上所有传递的参数列表。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-27 07:02:55

这里有一些不同之处,您可以在这个CodePen上看到完整的代码片段示例(尽管略有调整),但我将在这里详细说明:

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

代码语言:javascript
复制
this.event = ...
// ...
self.vm.$emit()
// ...
self.expression

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

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

上述三条线在手,则对应于:

代码语言:javascript
复制
el.event = ...
// ...
vnode.context.$emit()
// ..
binding.expression

最后,请注意:您的事件侦听器不会导致任何事情发生,因为您对元素的单击触发了一个stopProp函数(该函数被排除在您的代码片段之外),该函数可能调用stopPropagation(),但随后尝试在body上捕获传播的事件。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41338035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档