vue3-全局事件的使用

vue3-全局事件的使用

前言

对于全局事件总线,它是一种组件间通信的方式,可以让任意组件进行通信

它就相当于一个中间介质可以让组件通信,可以理解为他就是一个上帝,不参与组件,只负责通信

如下图

安装

vue3推荐使用mitt

安装mitt

1
npm install 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() //相当于Vue2中的this
const bus = cxt.appContext.config.globalProperties.$bus
const emitMitt = function(){
bus.emit('printMessage','我被触发了') //触发其他组件监听的名为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' //引入bus.js文件

//在setup中
let clikmenu=(e)=>{
events.emit("clikmenu",e) //可以直接使用
}

主要使用的三种方法

分别是emitonoff

1
2
3
4
//三种方法的主要结构分别是
emit(name,data) // 触发相应事件 name:触发事件的名字 data:传递过去的参数
on(name,callback) //绑定相应的事件等待emit的触发 name:触发事件的名字 callback:出发后执行回调函数
off(name) //解绑相应事件 name:需要解绑的事件名

注意:必须保证先绑定事件再触发事件

以下示例

在layout组件中

1
2
3
4
5
6
7
8
9
10
11
12
13
import {events} from '../../bus.js' 

//在setup中
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'
//setup中
let clikm=(e)=>{
events.emit("clikmenu",e)
}

当在aside.vue组件执行点击函数clikm就会触发layout.vue中的onMounted中绑定好的事件的回调函数


vue3-全局事件的使用
http://move-brain.github.io/super_zhu/2023/04/04/vue3-全局事件的使用/
作者
super_zhu
发布于
2023年4月4日
更新于
2023年4月4日
许可协议