Vue Bus 是一种事件总线的实现方式,用于在不同组件之间进行通信。在 Vue 应用中,父子组件通信相对简单,但当需要在非父子关系的组件之间进行通信时,就需要借助一种中央事件总线的机制,这就是 Vue Bus 的作用。
说白就是建一个空白的vue,里面只处理 $emit
事件发布、$on
事件监听触发 以及 $off
事件销毁,来完成多层不同组件之间的通行。
// bus.js
import Vue from 'vue';
export const bus = new Vue();
// 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!
});
},
};
// ComponentB.vue
export default {
beforeDestroy() {
bus.$off('custom-event');
},
};
考虑一个购物车的应用,有一个商品列表组件和一个购物车组件,它们之间需要实现添加商品到购物车的功能。
<!-- 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 的基本原理和一个实际应用的例子。通过这种方式,不同组件之间可以更轻松地进行通信,提高了组件之间的灵活性和复用性