vue3-全局事件的使用
前言
对于全局事件总线,它是一种组件间通信的方式,可以让任意组件进行通信
它就相当于一个中间介质可以让组件通信,可以理解为他就是一个上帝,不参与组件,只负责通信
如下图

安装
vue3推荐使用mitt
安装mitt
mitt引入
全局引入
在main.js文件
1 2 3 4
| import mitt from "mitt" const app = createApp(App) const bus = mitt() app.config.globalProperties.$bus = bus
|
在组件内使用
1 2 3 4 5 6
| import { getCurrentInstance } from 'vue' const cxt = getCurrentInstance() const bus = cxt.appContext.config.globalProperties.$bus const emitMitt = function(){ bus.emit('printMessage','我被触发了') }
|
局部引入(推荐)
在src目录内定义一个js文件(在这里是bus.js)
在bus.js文件中
1 2
| import mitt from 'mitt' export const events = mitt()
|
在使用的组件内
1 2 3 4 5 6 7
| import {events} from '../../bus.js'
let clikmenu=(e)=>{ events.emit("clikmenu",e) }
|
主要使用的三种方法
分别是emit,on,off
1 2 3 4
| emit(name,data) on(name,callback) off(name)
|
注意:必须保证先绑定事件再触发事件
以下示例
在layout组件中
1 2 3 4 5 6 7 8 9 10 11 12 13
| import {events} from '../../bus.js'
onMounted(()=>{ events.on("clikmenu",(e)=>{ console.log(e) }) })
onBeforeUnmount(()=>{ events.off('clikmenu') })
|
在aside.vue组件中
1 2 3 4 5 6 7
| <el-menu-item @click="clikm(item)" v-else :key="index + item.id" :index="item.id"> import {events} from '../../bus.js'
let clikm=(e)=>{ events.emit("clikmenu",e) }
|
当在aside.vue组件执行点击函数clikm就会触发layout.vue中的onMounted中绑定好的事件的回调函数