Vue.js 防止$emit在Vue中发射多次

Vue.js 防止$emit在Vue中发射多次,vue.js,eventemitter,bus,Vue.js,Eventemitter,Bus,我在Vue项目中有一个emit调用来更新搜索结果,但是emit至少被调用了4次,因为emit调用是在不同的位置定义的,因此数据是随它一起发出的,而在其他位置则不是 我正在使用全局总线执行发射 this.$root.bus.$emit('resetValuesInInfiniteLoader', filteredEntities); this.$root.bus.$on('resetValuesInInfiniteLoader', function (filteredEntities) {});

我在Vue项目中有一个emit调用来更新搜索结果,但是emit至少被调用了4次,因为emit调用是在不同的位置定义的,因此数据是随它一起发出的,而在其他位置则不是

我正在使用全局总线执行发射

this.$root.bus.$emit('resetValuesInInfiniteLoader', filteredEntities);

this.$root.bus.$on('resetValuesInInfiniteLoader', function (filteredEntities) {});
我尝试以不同的方式命名emits调用,也尝试使用不同的全局vue总线,但这两个选项都没有很好地工作。
你知道我如何以高效的方式做到这一点,使$emit总是只调用一次吗?我需要如何设置它以确保始终只调用一次emit?我还尝试过一次使用$emit,但没有成功,或者试图破坏$emit。有人能给我举个小提琴的例子吗?也许这样我就能理解如何用正确的方式来做了

我发现情况也是如此,并且觉得在多个位置使用它会有一些问题。我的理解是,在大多数应用程序中不建议使用全局事件总线,因为它们可能导致混乱的事件。建议您使用vuex之类的状态管理解决方案

但不管怎么说,上面的代码只涉及几点。我不知道您是如何创建总线的,但我知道如何创建总线:

//main.js

const EventBus = new Vue()
Object.defineProperties(Vue.prototype, {
  $bus: {
    get: function () {
      return EventBus
    }
  }
})
这创造了它,使它成为全球性的。然后,可以在一个或多个组件中使用以下方式触发:

<button @click="$bus.$emit('my-event')">click</button>

or

methods: {
    triggerMyEvent () {
      this.$bus.$emit('my-event', { ... pass some event data ... })
    }
  }
我发现它有时是有效的。我不知道为什么,但它会起作用,然后它会触发几个事件,我认为这是因为它还没有最终确定或什么的。你可能会注意到,我已经注释掉了这一点。$bus.off,这当然会阻止它,但它不会再次工作。所以我不知道这是怎么回事


好了,完全没有答案,如,是的,我也有,不,我无法修复它。

我使用vuex store,与应用程序中的任何组件通信似乎容易得多,具有全局通信的优势,但没有发送多个操作(如发出事件)的警告

是的,我确实同意你所写的非常有意义,我现在选择使用vuex store,我必须说它比那些全局“发射”事件更容易跟踪,我想它们只对组件之间简单和单一的通信有意义
created () {
            this.$bus.$on('my-event', ($event) => {
                console.log('My event has been triggered', $event)
                this.eventItem = 'Event has now been triggered'
                //this.$bus.$off('my-event')
            })

        },