084 全局事件总线1

x应该具备两个能力:1.所有组件都能看到x;2.可以调用$on,$off,$emit

全局事件总线(Global Event Bus)是一种在 Vue 应用中实现组件间通信的技术。它可以用于任意组件之间的通信,包括父子组件、兄弟组件以及跨层级的组件。全局事件总线的核心思想是创建一个独立的事件中心,组件可以通过这个中心来发送和接收事件。

创建全局事件总线

  1. main.js 中创建全局事件总线
import Vue from 'vue';
import App from './App.vue';

// 创建一个 Vue 实例作为事件总线
const bus = new Vue();

// 将事件总线挂载到 Vue 的原型对象上
Vue.prototype.$bus = bus;

new Vue({
  render: h => h(App),
}).$mount('#app');

使用全局事件总线

1. 发送事件

在发送事件的组件中,使用 $bus.$emit 方法来触发事件,并可以传递参数。

<template>
  <div>
    <button @click="sendEvent">发送事件</button>
  </div>
</template>

<script>
export default {
  methods: {
    sendEvent() {
      this.$bus.$emit('my-event', 'Hello from Sender Component');
    }
  }
};
</script>

2. 接收事件

在接收事件的组件中,使用 $bus.$on 方法来监听事件,并定义事件处理函数。可以在 beforeDestroy 生命周期钩子中使用 $bus.$off 方法来解绑事件,以避免内存泄漏。

<template>
  <div>
    <p>接收到的消息: {{ message }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: ''
    };
  },
  created() {
    this.$bus.$on('my-event', this.handleEvent);
  },
  beforeDestroy() {
    this.$bus.$off('my-event', this.handleEvent);
  },
  methods: {
    handleEvent(data) {
      this.message = data;
    }
  }
};
</script>

示例

假设我们有两个组件 SenderComponentReceiverComponent,我们需要从 SenderComponentReceiverComponent 发送消息。

SenderComponent.vue

<template>
  <div>
    <button @click="sendEvent">发送事件</button>
  </div>
</template>

<script>
export default {
  methods: {
    sendEvent() {
      this.$bus.$emit('my-event', 'Hello from Sender Component');
    }
  }
};
</script>

ReceiverComponent.vue

<template>
  <div>
    <p>接收到的消息: {{ message }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: ''
    };
  },
  created() {
    this.$bus.$on('my-event', this.handleEvent);
  },
  beforeDestroy() {
    this.$bus.$off('my-event', this.handleEvent);
  },
  methods: {
    handleEvent(data) {
      this.message = data;
    }
  }
};
</script>

总结

  1. 创建全局事件总线:在 main.js 中创建一个 Vue 实例并将其挂载到 Vue 的原型对象上。
  2. 发送事件:使用 $bus.$emit 方法触发事件。
  3. 接收事件:使用 $bus.$on 方法监听事件,并在 beforeDestroy 生命周期钩子中使用 $bus.$off 方法解绑事件。
posted @ 2024-10-29 15:53  一曲微茫  阅读(4)  评论(0编辑  收藏  举报