【Vue项目】 bus事件总线

一、 Vue Bus 总线原理

Vue Bus 是一种事件总线的实现方式,用于在不同组件之间进行通信。在 Vue 应用中,父子组件通信相对简单,但当需要在非父子关系的组件之间进行通信时,就需要借助一种中央事件总线的机制,这就是 Vue Bus 的作用。
在这里插入图片描述
说白就是建一个空白的vue,里面只处理 $emit 事件发布、$on事件监听触发 以及 $off 事件销毁,来完成多层不同组件之间的通行。

二、Vue bus的使用

1、创建总线: 在 Vue 应用中,可以创建一个 Vue 实例作为总线,用于管理事件。

// bus.js
import Vue from 'vue';
export const bus = new Vue();

2、事件的发布与订阅: 组件通过订阅事件来监听总线上的消息,而其他组件则通过发布事件来触发消息。

// ComponentA.vue
import { bus } from './bus.js';

export default {
  methods: {
    handleClick() {
      bus.$emit('custom-event', 'Hello from Component A!');
    },
  },
};
// ComponentB.vue
import { bus } from './bus.js';

export default {
  mounted() {
    bus.$on('custom-event', (message) => {
      console.log(message); // Hello from Component A!
    });
  },
};

3、销毁总线: 在组件销毁时,应该取消对事件的订阅以防止内存泄漏。

// ComponentB.vue
export default {
  beforeDestroy() {
    bus.$off('custom-event');
  },
};

4、注意:

  1. bus总线的on执行先与emit
    原因:父子生命周期顺序的影响,父beforeCreate-父created-父beforeMount-子beforeCreate-子created-子beforeMount-子mounted-父mounted
  2. bus总线的emit不适宜写在creted中,要写在mounte钩子函数中。
    原因:on是要早于emit,而且受父子生命周周期的影响,emit要写在nounted函数里。
  3. 发布事件在使用完后,记得off 注销事件,防止内存泄漏。

三、Vue bus 实际应用

场景

考虑一个购物车的应用,有一个商品列表组件和一个购物车组件,它们之间需要实现添加商品到购物车的功能。

示例代码

<!-- ProductList.vue -->
<template>
  <div>
    <div v-for="product in products" :key="product.id">
      <p>{{ product.name }}</p>
      <button @click="addToCart(product)">Add to Cart</button>
    </div>
  </div>
</template>

<script>
import { bus } from './bus.js';

export default {
  data() {
    return {
      products: [
        { id: 1, name: 'Product A' },
        { id: 2, name: 'Product B' },
        { id: 3, name: 'Product C' },
      ],
    };
  },
  methods: {
    addToCart(product) {
      bus.$emit('add-to-cart', product);
    },
  },
};
</script>
<!-- ShoppingCart.vue -->
<template>
  <div>
    <h2>Shopping Cart</h2>
    <ul>
      <li v-for="item in cartItems" :key="item.id">
        {{ item.name }}
      </li>
    </ul>
  </div>
</template>

<script>
import { bus } from './bus.js';

export default {
  data() {
    return {
      cartItems: [],
    };
  },
  mounted() {
    bus.$on('add-to-cart', (product) => {
      this.cartItems.push(product);
    });
  },
  beforeDestroy() {
    bus.$off('add-to-cart');
  },
};
</script>

在这个例子中,ProductList 组件通过 Vue Bus 发送了一个 ‘add-to-cart’ 事件,而 ShoppingCart 组件监听了这个事件,并在事件发生时将商品添加到购物车中。

这就是 Vue Bus 的基本原理和一个实际应用的例子。通过这种方式,不同组件之间可以更轻松地进行通信,提高了组件之间的灵活性和复用性

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue事件总线是一种在组件之间进行通信的机制,它允许一个组件触发事件并让其他组件监听和响应这些事件。如果你想手写一个简单的Vue事件总线,可以按照以下步骤进行: 1. 创建一个新的Vue实例作为事件总线: ```javascript // eventBus.js import Vue from 'vue'; const eventBus = new Vue(); export default eventBus; ``` 2. 在需要通信的组件中,导入事件总线并使用它: ```javascript // ComponentA.vue import eventBus from './eventBus'; export default { methods: { handleClick() { // 触发自定义事件,并传递数据 eventBus.$emit('customEvent', data); } } } ``` 3. 在需要监听事件的组件中,导入事件总线并使用它: ```javascript // ComponentB.vue import eventBus from './eventBus'; export default { created() { // 监听自定义事件 eventBus.$on('customEvent', this.handleCustomEvent); }, destroyed() { // 在组件销毁时取消事件监听 eventBus.$off('customEvent', this.handleCustomEvent); }, methods: { handleCustomEvent(data) { // 处理接收到的数据 } } } ``` 通过以上步骤,你就可以手写一个简单的Vue事件总线。在需要通信的组件中,使用`eventBus.$emit`来触发自定义事件,并可以传递数据;在需要监听事件的组件中,使用`eventBus.$on`来监听自定义事件,并在事件触发时执行相应的处理函数。记得在组件销毁时使用`eventBus.$off`来取消事件监听,以避免内存泄漏。 请注意,手写的Vue事件总线是一个简单的实现,它没有考虑到一些高级功能,如命名空间、多个事件总线实例等。如果需要更复杂的功能,可以考虑使用第三方插件或使用Vuex进行状态管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值