美文网首页react & vue & angular
Vue中 事件总线(eventBus)使用

Vue中 事件总线(eventBus)使用

作者: NemoExpress | 来源:发表于2022-06-02 11:42 被阅读0次

简介

在Vue中如果两个页面组件中没有任何引入和被引入关系,该如何通信呢?首先可能会想到是Vuex ,但是如果应用程序不需要类似 Vuex 这样的库来处理组件之间的数据通信,就可以考虑 Vue 中的事件总线 ,即 eventBus 来通信。
eventBus 又称为事件总线。在 Vue 中可使用 eventBus 来作为沟通桥梁的概念,就像是所有组件共用相同的事件中心,可向该中心注册发送事件或接收事件,所以组件都可以上下平行地通知其他组件。由于太方便如若使用不慎,就会造成难以维护的“灾难”,因此才需要更完善的 Vuex 作为状态管理中心,将通知的概念上升到共享状态层次。

使用

  1. 定义在组件中使用
import Vue from 'vue'
export const EventBus = new Vue()
  1. 定义在全局中使用(main.js文件)
// 创建全局EventBus
Vue.prototype.$EventBus = new Vue()
var EventBus = new Vue()
Object.defineProperties(Vue.prototype, {
    $bus: {
        get: function () {
            return EventBus
        }
    }
}
  1. 在组件中使用
    3.1 向EventBus发送事件
    this.$EventBus.$emit(发送的事件名,传递的参数)
    3.2 接收事件
    this.$EventBus.$on(监听的事件名, 回调函数)
    3.3 移除监听事件
    在组件离开,也就是被销毁前,需要将监听事件给移除,以免下次再重复创建监听
    //移除指定的事件监听:this.$EventBus.$off(事件名, {})
    / 移除所有的事件监听:this.$EventBus.$off()

案例:假设有两个Vue组件需要通信 ,在 A 组件的按钮上面绑定了点击事件发送一则消息,想通知 B 组件。

// A 组件
<template>
  <div class="wrap">
    <button @click="sendMsg">触发</button>
  </div>
</template>

<script>
export default {
  data(){
    return {
      Amsg:'我是来自A组件的信息',
    }
  },
  methods:{
    sendMsg(){
      this.$bus.emit('changeMsg', this.Amsg );
      this.$bus.emit('doOnce','我只会触发一次');
    }
  },
}
</script>

A组件已经向全局事件总线EventBus发送了一个aMsg事件,这时B组件就可以去aMsg监听这个事件,并可以获得一些数据。

// B 组件
<template>
  <div>
    <h3>{{Bmsg}}</h3>
  </div>
</template>

<script>
export default {
  data(){
    return {
      Bmsg:'我是B组件',
    }
  },
  methods:{
    getMsg(msg){
      this.Bmsg = msg;
      console.log(msg);
    }
  },
  created(){
    /*
    * 接收事件
    * 这种写法也体现了:A 组件调用 B 组件中的方法。如果只是传递数据,可参考如下简化写法:
    * this.$bus.on('changeMsg', (msg) => { this.Bmsg = msg });
    */ 
    this.$bus.on('changeMsg', this.getMsg);
    // 此侦听器只会触发一次
    this.$bus.once('doOnce', (txt) => { console.log(txt) });
  },
  // 组件销毁时,移除EventBus事件监听
  beforeDestroy() {
    this.$bus.off('changeMsg', this.getMsg);
  },
}
</script>

总结

eventBus 适合小项目、数据被更少组件使用的项目,对于中大型项目数据在很多组件之间使用的情况 eventBus 就不太适用了。eventBus 其实就是一个发布订阅模式,利用 Vue 的自定义事件机制,在触发的地方通过 $emit 向全局Bus外发布一个事件,在需要监听的页面,通过$on 监听事件。最后在组件销毁时,需要通过$off将事件移除监听

相关文章

  • Vue的事件总线

    事件总线是什么? EventBus 又称为事件总线。在Vue中可以使用 EventBus 来作为沟通桥梁的概念,就...

  • EventBus

    EventBus的简介 EventBus 又称为事件总线。在Vue中可以使用 EventBus 来作为沟通桥梁的概...

  • vue 事件总线EventBus的概念、使用

    两个组件之间毫无关系,用到 vue 中的事件总线 EventBus的概念来传递数据 EventBus又称事件总线,...

  • Vue中 事件总线(eventBus)使用

    简介 在Vue中如果两个页面组件中没有任何引入和被引入关系,该如何通信呢?首先可能会想到是Vuex ,但是如果应用...

  • vue事件总线EventBus

    vue组件有父子组件通信:props兄弟组件通信:可以使用vuex,还可以使用事件总线eventBus 使用方法:...

  • vue2.x+element-ui项目常遇到的问题

    1.清除定时器2.Vue事件总线(eventBus)$on()会多次触发3.vue 在table中增/删/改/查,...

  • Android | 这是一份详细的 EventBus 使用教程

    前言 在Android开发中,EventBus事件总线机制十分常用; 今天,我将整理EventBus详细的使用教程...

  • Vue事件总线(EventBus)

    阐述一下 VUE中 eventbus 的原理 解答:EventBus是消息传递的一种方式,基于一个消息中心,订阅和...

  • Vue事件总线(EventBus)

    vue组件非常常见的有父子组件通信,兄弟组件通信。而父子组件通信就很简单,父组件会通过props向下传数据给子组件...

  • EventBus源码解析

    ​ EventBus是Android平台上一个发布/订阅事件总线,使用EventBus可以方便的在不同的组件中...

网友评论

    本文标题:Vue中 事件总线(eventBus)使用

    本文链接:https://www.haomeiwen.com/subject/fghqmrtx.html