vue组件非常常见的有父子组件通信,兄弟组件通信。而父子组件通信就很简单,父组件会通过 props 向下传数据给子组件,当子组件有事情要告诉父组件时会通过 $emit 事件告诉父组件。
但是两个页面没有任何引入与被引入关系,该怎么通信呢?
如果咱们的应用程序不需要类似Vuex这样的库来处理组件之间的数据通信,就可以考虑Vue中的 事件总线 ,即 EventBus来通信。
EventBus的使用
1.初始化(有两种方式),首先需要创建事件总线并将其导出,以便其它模块可以使用或者监听它。
(1)新创建一个 .js 文件,比如 event-bus.js
// event-bus.js
import Vue from 'vue'
export const EventBus = new Vue()
(2)可以直接在项目中的 main.js 初始化 EventBus
// main.js
Vue.prototype.$EventBus = new Vue()
注意,这种方式初始化的EventBus是一个全局的事件总线。
2.发送事件
假设你有两个Vue页面需要通信: A 和 B ,A页面 在按钮上面绑定了点击事件,发送一则消息,通知 B页面。
<template>
<button @click="sendMsg()">-</button>
</template>
<script>
import { EventBus } from "../event-bus.js";
export default {
methods: {
sendMsg() {
EventBus.$emit("message", '来自A页面的消息');
}
}
};
</script>
EventBus.$emit(‘message’,data) // 这个message是一个自定义的事件名称,data就是你要传递的数据。
3.接收事件
接下来,我们需要在 B页面 中接收这则消息。
<template>
<p>{{msg}}</p>
</template>
<script>
import {
EventBus
} from "../event-bus.js";
export default {
data(){
return {
msg: ''
}
},
mounted() {
EventBus.$on("message", (msg) => {
// A发送来的消息
this.msg = msg;
});
}
};
</script>
EventBus.$on('message',msg=> {
console.log(msg)
})
注意:发送和监听的事件名称必须一致,msg就是获取的数据。第一个参数是事件名,第二个参数是方法
同理我们也可以在 B页面 向 A页面 发送消息。这里主要用到的两个方法:
// 发送消息
EventBus.$emit(channel: string, callback(payload1,…))
// 监听接收消息
EventBus.$on(channel: string, callback(payload1,…))
4.移除事件监听者
如果想移除事件的监听,可以像下面这样操作:
import {
eventBus
} from './event-bus.js'
beforeDestroy(){
EventBus.$off('message')
}
在vue生命周期beforeDestroy或者destroyed中用vue实例的$off方法清除eventBus
全局eventBus
// main.js
Vue.prototype.$EventBus = new Vue()
在这个特定的总线中使用两个方法$ on和$ emit。一个用于创建发出的事件,它就是$ emit;另一个用于订阅$ on:
然后我们可以在某个Vue页面使用this.$ bus.$emit(“sendMsg”, ‘我是web秀’);,另一个Vue页面使用
this.$EventBus .$on('sendMsg', function(value) {
console.log(value); // 我是web秀
})
同时也可以使用this.$ EventBus .$off(‘sendMsg’)来移除事件监听。
注意:在vue生命周期beforeDestroy或者destroyed中用vue实例的 $off方法清除eventBus