vue组件中最常见的数据传递就是父子组件之间的传递,父组件可以通过props向下传数据给子组件,子组件可以通过$emit事件携带数据给父组件。然而当两个页面没有任关系,该如何通信?这就引出了EventBus(事件总线)这个概念初始化方法一:新建文件首先需要初始化一个EventBus,并且向外共享一个
vue组件中最常见的数据传递就是父子组件之间的传递,父组件可以通过 props 向下传数据给子组件,子组件可以通过 $emit 事件携带数据给父组件。然而当两个页面没有任关系,该如何通信?这就引出了 EventBus ( 事件总线 ) 这个概念
初始化
方法一:新建文件
首先需要初始化一个 EventBus,并且向外共享一个 Vue 的实例对象
新建一个 js 文件,比如:EventBus.js
| |
| import Vue from 'vue' |
| |
| |
| export default new Vue() |
方法二:挂载在 Vue 的原型上
在 main.js 中初始化 EventBus
| |
| |
| Vue.prototype.$EventBus = new Vue() |
| |
传递数据
| |
| |
| |
| import EventBus from '@/utils/EventBus' |
| |
| |
| EventBus.$emit('share', this.a_data); |
接收数据
| |
| |
| |
| import EventBus from '@/utils/EventBus' |
| |
| |
| |
| EventBus.$on('share', value => { |
| this.b_data = value; |
| }) |
移除事件
在组件离开,也就是被销毁前,需要将该监听事件给移除,以免下次再重复创建监听
完整代码
utils/EventBus.js
| import Vue from 'vue' |
| |
| |
| export default new Vue() |
A 组件代码
| <template> |
| <div> |
| <button @click="send">点我发送消息</button> |
| </div> |
| </template> |
| |
| <script> |
| import EventBus from '@/utils/EventBus' |
| |
| export default { |
| data:()=>({ |
| a_data: 'message' |
| }), |
| methods: { |
| send () { |
| EventBus.$emit('share', this.a_data); |
| } |
| } |
| } |
| </script> |
| |
B 组件代码
| <template> |
| <div> |
| <h1>{{ b_data }}</h1> |
| </div> |
| </template> |
| |
| <script> |
| import EventBus from '@/utils/EventBus' |
| |
| export default { |
| data: () => ({ |
| b_data: null |
| }), |
| created () { |
| EventBus.$on('share', value => { |
| |
| this.b_data = value; |
| }) |
| }, |
| beforeDestroy() { |
| |
| EventBus.$off('share') |
| } |
| } |
| </script> |