在main.js文件中进行挂载
注: 中央事件总线实现方法也可以这么实现
- 直接创建一个新的js文件,在文件中创建并导出一个vue实例。
- 在需要通信的两个组件中分别引入这个bus.js
- 传递数据的组件里通过vue实例方法$emit发送事件名称和需要传递的数据。(发送数据组件)
- 被传递数据的组件内通过vue实例方法$on监听到事件和接受到数据。
这种方法在Vue组件之间的通信方式的总结这篇文章中阐述过,同时里面还有其他几种通信方式。
这篇文章主要说vue的中央事件总线,并且选择的方式是直接创建一个vue实例,并将其挂载到vue的原型上(Vue.prototype),这样我们就能在任意一个vue组件中进行方法调用。这样实现起来我认为更为简便直接。 在main.js文件中代码如下:
Vue.prototype.$bus = new Vue();
在对应的组件中进行事件的发起和监听
const data = 'abc'
this.$bus.$emit('fn', data)
methods: {
foo(val) {
console.log(val)
}
}
mounted() {
this.$bus.$on('fn', this.foo)
}
beforeDestroy() {
this.$bus.$off("fn");
},
注意事项(中央事件总线不生效)
由于中央事件总线常用于跨级组件,有时朋友们会遇到事件发起了,但监听事件无反应的情况。 引起这个情况的可能原因是:发起事件的组件在发起事件时,监听事件的组件还未挂载或还未进行事件的监听。(简单来说就是,监听事件(on)要在发起事件(emit)之前)
|