中央事件总线插件 vue-bus

bus作为一个简单的组件传递事件,用于解决跨级和兄弟组件通信的问题。
vue-bus 插件像vue-router和Vuex一样,给Vue添加一个属性$bus,并代理 e m i t 、 emit、 emiton、$off三个方法。

vue-bus.js
const install = function (Vue) {
	const Bus = new Vue({
		methods: {
			emit (event, ...args) {
				this.$emit(event, ...args);
			},
			on (event, callback) {
				this.$on(event, callback)
			},
			off (event, callback) {
				this.$off(event, callback);
			}
		}
	});
	Vue.prototype.$bus = Bus;
};
export default install;
语法提示:
emit(event, ...args)

中的…args 是函数参数的解构,因为不知道组件会传递多少个参数,使用…args 可以把从当前参数(这里是第二个)到最后的参数都获取到。

Counter.vue组件
<template>
	<div>
		{{ number }}
		<button @click="handleAddRandom">随机增加</button>
	</div>
</template>
<script>
	export default {
		props: {
			number: {
				type: Number
			}
		},
		methods: {
			handleAddRandom () {
				const num = Math.floor(Math.random () * 100 +1);
				this.$bus.emit('add', num)
			}
		}
	};
</script>
<style scoped></style>
main.js使用插件
import VueBus from './pages/VueBus/vue-bus';
Vue.use(VueBus);
在index.vue使用Counter组件
<template>
	<div>
		随机增加:
		<Counter :number="number"></Counter>
	</div>
</template>
<script>
import Counter from '../pages/vueBus/Counter'
export default {
	 components: {
	  	Counter
	  },
	  created () {
	  	this.$bus.on('add', num => {
	  		this.number += num;
	  	})
	  },
};

使用以上方式解决了跨组件通信的问题,而且通过插件的形式使用后,所有的组件都可以直接用 $bus,无需每个组件都导入bus组件。

注意

1、$bus.on 应该在 created 钩子内使用,如果在 mounted 使用,他可能接收不到其他组件来自 created 钩子内发出的事件;

2、使用了 b u s . o n , 在 b e f o r e D e s t o r y 狗 子 里 应 该 使 用 bus.on,在beforeDestory狗子里应该使用 bus.onbeforeDestory使bus.off解除,因为组件销毁后,没必要把监听的句柄存在vue-bus里了,所以index.vue中应该再加入

beforeDestory () {
	this.$bus.off('add', this.handleAddRandom)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值