vue的中央事件总线,实现任何组件之间的相互通信

在main.js文件中进行挂载

注: 中央事件总线实现方法也可以这么实现

  1. 直接创建一个新的js文件,在文件中创建并导出一个vue实例。
  2. 在需要通信的两个组件中分别引入这个bus.js
  3. 传递数据的组件里通过vue实例方法$emit发送事件名称和需要传递的数据。(发送数据组件)
  4. 被传递数据的组件内通过vue实例方法$on监听到事件和接受到数据。

这种方法在Vue组件之间的通信方式的总结这篇文章中阐述过,同时里面还有其他几种通信方式。

这篇文章主要说vue的中央事件总线,并且选择的方式是直接创建一个vue实例,并将其挂载到vue的原型上(Vue.prototype),这样我们就能在任意一个vue组件中进行方法调用。这样实现起来我认为更为简便直接。 在main.js文件中代码如下:

// main.js
Vue.prototype.$bus = new Vue();

在对应的组件中进行事件的发起和监听

// 发起事件的组件 this.$bus.$on
// 在对应代码处发起事件
// fn   为发起的事件名称,会被$bus.$on监听,可以自己定义名称(发起与监听的名称要一致)
// data 为需要传递的数据,能够在$bus.$on处获取
const data = 'abc'
this.$bus.$emit('fn', data)
// 响应事件的组件 this.$bus.$emit
// 先在mounted中进行注册监听
//(注意:注册监听的组件中,在组件销毁前记得通过$off注销对中央事件中线的监听)
// fn  为监听的事件名称,会由$emit发起,可以自己定义名称(发起与监听的名称要一致)
// foo 为响应事件的具体方法
methods: {
    
    
	foo(val) {
    
    
		console.log(val) // abc
	}
}
mounted() {
    
    
	this.$bus.$on('fn', this.foo)
}
beforeDestroy() {
    
    
  	this.$bus.$off("fn");
},

注意事项(中央事件总线不生效)

由于中央事件总线常用于跨级组件,有时朋友们会遇到事件发起了,但监听事件无反应的情况。
引起这个情况的可能原因是:发起事件的组件在发起事件时,监听事件的组件还未挂载或还未进行事件的监听。(简单来说就是,监听事件(on)要在发起事件(emit)之前

猜你喜欢

转载自blog.csdn.net/IT_dabai/article/details/126946467