Vue3(Mitt)
Vue2.x 使用 EventBus 进行组件通信,而 Vue3.x 推荐使用 mitt.js。
比起 Vue 实例上的 EventBus,mitt.js 好在哪里呢?首先它足够小,仅有200bytes,其次支持全部事件的监听和批量移除,它还不依赖 Vue 实例,所以可以跨框架使用,React 或者 Vue,甚至 jQuery 项目都能使用同一套库。
可参考
https://juejin.cn/post/6973106775755063333
方法一
封装成事件,每次使用都需要引用
目录
注册
import Mitt from "mitt";
const eventHub = new Mitt();
export default eventHub;
使用
import eventHub from "@/utils/eventHub";
import { ref } from "vue";
const currentActive = ref(null);
eventHub.on("spriteClick", (data) => {
currentActive.value = data.i;
});
const toggleEvent = (i) => {
currentActive.value = i;
eventHub.emit("eventToggle", i);
};
方法二
全局注册并挂载,只需要导入一次
Vue3 + vite + Ts + pinia + 实战 + 源码 +全栈_哔哩哔哩_bilibili 视频教程
在vue3中$on,$off 和 $once 实例方法已被移除,组件实例不再实现事件触发接口,因此大家熟悉的EventBus便无法使用了。然而我们习惯了使用EventBus,对于这种情况我们可以使用Mitt库(其实就是我们视频中讲的发布订阅模式的设计)
1.安装
npm install mitt -S
2.main.ts 初始化
全局总线,vue 入口文件 main.js 中挂载全局属性
import { createApp } from 'vue' import App from './App.vue' import mitt from 'mitt' const Mit = mitt() //TypeScript注册 // 由于必须要拓展ComponentCustomProperties类型才能获得类型提示 declare module "vue" { export interface ComponentCustomProperties { $Bus: typeof Mit } } const app = createApp(App) //Vue3挂载全局API app.config.globalProperties.$Bus = Mit app.mount('#app')
3.使用方法
通过emit派发, on 方法添加事件,off 方法移除,clear 清空所有
A组件派发(emit)
<template> <div> <h1>我是A</h1> <button @click="emit1">emit1</button> <button @click="emit2">emit2</button> </div> </template> <script setup lang='ts'> import { getCurrentInstance } from 'vue' const instance = getCurrentInstance(); const emit1 = () => { instance?.proxy?.$Bus.emit('on-num', 100) } const emit2 = () => { instance?.proxy?.$Bus.emit('*****', 500) } </script> <style> </style>
B组件监听(on)
<template> <div> <h1>我是B</h1> </div> </template> <script setup lang='ts'> import { getCurrentInstance } from 'vue' const instance = getCurrentInstance() instance?.proxy?.$Bus.on('on-num', (num) => { console.log(num,'===========>B') }) </script>
监听所有事件( on("*") )
instance?.proxy?.$Bus.on('*',(type,num)=>{ console.log(type,num,'===========>B') })
移除监听事件(off)
const Fn = (num: any) => { console.log(num, '===========>B') } instance?.proxy?.$Bus.on('on-num',Fn)//listen instance?.proxy?.$Bus.off('on-num',Fn)//unListen
清空所有监听(clear)
instance?.proxy?.$Bus.all.clear()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)