首页/新闻资讯/正文详情

Vue 全局事件总线详解

发布时间:2026/9/27 2:33:57 来源:云帆数科 栏目:资讯中心
Vue 全局事件总线详解
一、什么是事件总线1.1 定义事件总线(Event Bus)本质上就是一个居中转发消息的邮局:发送方不直接找接收方,而是把消息丢给总线,总线再帮转给所有订阅了这个消息的人。在 Vue 里,它用来解决任意两个组件之间通信的问题,不限于父子,不限于兄弟,只要挂在同一条总线上就能互相收发。1.2 生活类比把事件总线想象成广播电台:你想听某个节目 → 先去电台登记订阅(订阅事件)主持人想播报 → 把内容交给电台($emit)电台把内容推给所有登记过的人主持人和听众互相不认识,也不需要知道对方在哪,只跟电台打交道。这就是事件总线的核心思想:解耦发送方和接收方。1.3 为什么要用Vue 组件通信的原生方式有局限:通信方式限制props / emits只能父子,跨层级要一层层透传(Prop Drilling)$refs父直接操作子,反向不行,兄弟也不行provide/inject父给后代单向,后代回父不直接Vuex / Pinia适合管全局状态,小事件通知有点重事件总线就填了这些空缺:任意两个组件都能对话,写法还特别轻。适合做开关侧边栏、“切换主题”、用户登出广播这种一次性通知类需求。二、Vue 2 的实现:用 Vue 实例当总线2.1 核心思路Vue 2 里,每个 Vue 实例都自带事件接口$on/$emit/$off/$once。所以新建一个空的 Vue 实例当总线就行,谁需要谁引入。// src/eventBus.jsimportVuefromvue;constbusnewVue();// ← 一个空实例,啥都没有,但有事件接口exportdefaultbus;2.2 基本用法:订阅 发布// 组件A:订阅login事件importbusfrom/eventBus;exportdefault{created(){bus.$on(login,(user){console.log(收到登录:,user);// ← 任何组件 emit 都能收到});},beforeDestroy(){bus.$off(login);// ← 必须解绑,否则内存泄漏}}// 组件B:发布login事件importbusfrom/eventBus;exportdefault{methods:{doLogin(){bus.$emit(login,{name:张三});// ← 不用管谁在听}}}A 和 B 可能隔着十层组件,可能根本不是父子,但只要都引入了bus,消息就能传过去。2.3 四个 API 速查方法作用用法$on(event, fn)订阅事件bus.$on(hi, fn)$emit(event, …args)发布事件,可带参数bus.$emit(hi, 1, 2)$off(event, fn)解绑;不传 fn 解绑该事件全部bus.$off(hi)或bus.$off(hi, fn)$once(event, fn)订阅一次,触发后自动解绑bus.$once(init, fn)三、Vue 3 的实现:mitt 或手写3.1 为什么 Vue 2 的写法不行了Vue 3移除了实例上的$on/$off/$once(因为想跟组件实例解耦,推荐用 props/emits 显式通信)。所以new Vue()当总线这条路彻底断了,需要换工具。3.2 方案一:用 mitt(推荐)mitt是一个超轻量的事件总线库,~200 字节,API 和 Vue 2 的几乎一样。npminstallmitt// src/eventBus.jsimportmittfrommitt;constbusmitt();// ← 创建总线exportdefaultbus;// 组件A:订阅importbusfrom/eventBus;import{onMounted,onBeforeUnmount}fromvue;exportdefault{setup(){constonLogin(user)console.log(登录:,user);onMounted(()bus.on(login,onLogin));onBeforeUnmount(()bus.off(login,onLogin));return{};}}// 组件B:发布importbusfrom/eventBus;exportdefault{setup(){constdoLogin()bus.emit(login,{name:张三});return{doLogin};}}mitt 的 API 对照:mitt 方法Vue 2 对应备注on(type, handler)$on完全对应emit(type, data)$emit只能传一个 data,不能像 $emit 多参off(type, handler)$off同样支持只传 type 解绑全部clear()无清空所有订阅3.3 方案二:手写一个 EventEmitter不想引入依赖,自己写也很短:// src/eventBus.jsclassEventBus{constructor(){this.mapnewMap();// ← { type: [fn1, fn2, ...] }}on(type,fn){if(!this.map.has(type))this.map.set(type,[]);this.map.get(type).push(fn);}emit(type,...args){constfnsthis.map.get(type);if(!fns)return;fns.forEach(fnfn(...args));}off(type,fn){if(!fn){this.map.delete(type);return;}// ← 不传 fn,清空整个事件constfnsthis.map.get(type);if(fns)this.map.set(type,fns.filter(ff!fn));}clear(){this.map.clear();}}exportdefaultnewEventBus();用法和 mitt 一模一样。手写版的好处是能看清原理,坏处是要自己保证this指向、处理 once 等边缘情况。3.4 注解1.mitt 的 emit 只能带一个参数Vue 2 里可以bus.$emit(hi, 1, 2, 3),mitt 只能bus.emit(hi, { a:1, b:2 }),多个参数要打包成对象。这是设计差异,不是 bug。2.为什么 Vue 3 推荐显式通信却还保留 mitt显式通信(props/emits/provide)在父子链路上更清晰,但跨层级、跨业务模块时,层层透传成本太高。mitt 是为了这类广播型场景留的口子,不是替代 props。四、实战案例:全局侧边栏开关需求:一个按钮(在任何位置)点击后,打开/关闭侧边栏(也在任何位置)。4.1 总线文件// src/eventBus.jsimportmittfrommitt;exportdefaultmitt();4.2 侧边栏组件:监听开关!-- SideBar.vue -- template aside v-showvisible侧边栏内容/aside /template script setup import bus from /eventBus; import { ref, onMounted, onBeforeUnmount } from vue; const visible ref(false); const toggle (v) (visible.value v); // ← 收到指令就改 onMounted(() bus.on(sidebar:toggle, toggle)); onBeforeUnmount(() bus.off(sidebar:toggle, toggle)); /script4.3 触发按钮:发广播!-- MenuButton.vue -- template button clickopen打开侧边栏/button /template script setup import bus from /eventBus; const open () bus.emit(sidebar:toggle, true); // ← 不关心谁在听 /script按钮和侧边栏没有任何 props 约定,谁也不依赖谁。换一个按钮、加一个开关,只要emit(sidebar:toggle, x)就行。

相关推荐

PADS Logic到OrCAD转换全流程:工具迁移、网表关联与高频问题排查
PADS Logic到OrCAD转换全流程:工具迁移、网表关联与高频问题排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 2:33:51

AI正在悄悄淘汰律师职业,但会用它的人反而涨薪了
AI正在悄悄淘汰律师职业,但会用它的人反而涨薪了

过去一年半,我眼看着 Codex 这类编程 Agent 把我们行业的”初级活”吃掉了一大块:写单测、改样板代码、查日志、搭数据管道,以前要带一个应届生干两周的事,现在一个中级工程师开几个并行任务,一下午收工。组里没人被裁… · 2026/9/27 2:33:44

六因子选股与双指标择时:量化策略回测实战拆解
六因子选股与双指标择时:量化策略回测实战拆解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 2:33:26

商业秘密权
商业秘密权

商业秘密权商业秘密是一种无形的信息财产,我国《反不正当竞争法》确认了商业秘密的财产属性,并规定侵权人负有赔偿责任。根据多数国家法律的规定,商业秘密权归属于知识产权领域。商业秘密的构成要件有以下几点:信息性、保密性、未… · 2026/9/27 3:14:24

Qwen3-ASR vLLM 高性能部署指南:128 并发下的极致吞吐调优实战
Qwen3-ASR vLLM 高性能部署指南:128 并发下的极致吞吐调优实战

Qwen3-ASR vLLM 高性能部署指南:128 并发下的极致吞吐调优实战 【免费下载链接】Qwen3-ASR Qwen3-ASR is an open-source series of ASR models developed by the Qwen team at Alibaba Cloud, supporting stable multilingual speech/music/song recognition, language detect… · 2026/9/27 3:14:18

网站被黑挂马速查手册:搞懂人家做网站是什么
网站被黑挂马速查手册:搞懂人家做网站是什么

网站被黑挂马速查手册:搞懂人家做网站是什么 网站突然打不开,或者打开后弹窗全是乱七八糟的博彩广告,后台密码怎么改都进不去,这种时刻最让人崩溃。很多老板第一反应是找技术,但这时候问“人家做网站是什么”,其实是在问一套完整的防御与恢复逻辑。我整… · 2026/9/27 3:14:05

1PPS时间同步原理与实战:从GPS授时到设备高精度对齐
1PPS时间同步原理与实战:从GPS授时到设备高精度对齐

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 3:13:41

3个平台实测:什么网站出项目找人做靠谱,告别拖期
3个平台实测:什么网站出项目找人做靠谱,告别拖期

3个平台实测:什么网站出项目找人做靠谱,告别拖期 改个需求建站公司拖一周,这种痛苦谁做推广谁懂。你催他,他说要排期;你加急,他说要加价。别急,今天咱们不聊虚的,直接上 对比评测… · 2026/9/27 3:13:35

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码