【问题标题】:How can I fire component specific events from within a class in a Vue component?如何从 Vue 组件的类中触发组件特定事件?
【发布时间】:2019-02-27 18:55:01
【问题描述】:

我正在尝试将Fine Uploader 集成到我基于 Laravel 和 Vue 构建的项目中。这个项目有很多我必须支持的遗留代码(例如旧的 CSS 类等),所以我需要将 Fine Uploader 集成为 JS 插件,并且不能使用任何可能存在的existing 3rd party Vue Fine Uploader components

我已经设法让它大部分工作。但是,这是我向您提出的挑战。下面,您可以看到我的代码截图,其中我在挂载的钩子中实例化 Fine Uploader 实例。

如您所见,我突出显示了在提交新文件以供上传时发出事件的代码部分。然而在这里,因为我在 Fine Uploader 实例中,所以当我这样做时。$emit,它不起作用(因为它不应该)。

我试图通过使用全局 eventBus 来规避这个问题。这可行,但是当多个文件同时放入上传器时会产生问题。该事件多次触发,并且经常忘记哪个实例触发了哪个事件,从而导致“缩略图组件”执行重复操作。

我确信我需要触发“特定于组件”的事件,以便生成和更新的缩略图组件(onProgress 和 onComplete)只执行一次相关操作。

如何从另一个类实例化中触发组件特定事件?

谢谢。

【问题讨论】:

  • doesn't work,你的意思是$emitthis中不存在onSubmitted吗?
  • 正确,这就是我会得到的错误。

标签: vue.js vuejs2


【解决方案1】:

您的函数回调没有绑定其上下文,因此回调中的 this 不引用 Vue 实例(这将导致 $emit 成为 undefined)。

有几种不同的解决方案:

  • 使用arrow-function

    onSubmitted: (id, name) => {
      // `this` is Vue instance
    }
    
  • Function#bind绑定函数上下文:

    onSubmitted: function(id, name) {
       // `this` is Vue instance
    }.bind(this)
    
  • 使用对 Vue 实例的缓存引用:

    const vm = this;
    const f = new qq.FineUploaderBasic({
      // ...
      onSubmitted: function(id, name) {
         vm.$emit(...)
      }
    })
    

【讨论】:

  • 非常感谢您。就个人而言,我发现第一个选项是最干净的,并且在我的实施中更喜欢它。再次感谢!
  • @Kopty 没问题 :) 同意!
  • 感兴趣的人更新:我最终使用了方法 #3,因为稍后在我的代码中,FineUploaderBasic 对象中有一些函数,我正在使用诸如“this.getUuid(photo)”之类的命令, 并且这些不起作用,因为一旦在选项 1 和 2 中以这种方式绑定,它就会在调用 'this' 时引用 Vue 组件。给猫剥皮的许多方法。感谢 tony19 提供了各种方法来做到这一点。
猜你喜欢
  • 2021-01-20
  • 2017-03-29
  • 2017-08-08
  • 2022-10-16
  • 1970-01-01
  • 1970-01-01
  • 2020-05-17
  • 2020-04-26
  • 1970-01-01
相关资源
最近更新 更多