当前位置: 首页 > article >正文

详解 Vue.js 中的 $emit 与 $on:自定义事件的发布订阅模式

详解 Vue.js 中的$emit与$on自定义事件的发布订阅模式在 Vue.js 的组件通信中$emit和$on是实现自定义事件发布订阅模式的核心方法。这种模式允许组件之间通过事件进行灵活的通信特别适用于父子组件或非父子关系的组件间通信。本文将深入探讨这两个方法的原理、使用场景和最佳实践。一、发布订阅模式基础发布订阅模式Pub/Sub是一种消息通信模式包含三个核心角色发布者Publisher发送事件通知的组件订阅者Subscriber监听特定事件的组件事件中心Event Bus管理事件订阅和发布的中间层在 Vue 中组件实例本身就可以作为事件中心通过$on订阅事件$emit发布事件。二、$emit方法详解1. 基本语法this.$emit(event-name,[...args])event-name事件名称字符串[...args]可选参数传递给事件处理函数的参数2. 工作原理当调用$emit时Vue 会在当前组件实例上查找所有通过$on订阅了该事件的处理器按添加顺序依次执行这些处理器将传入的参数依次传递给每个处理器3. 实际应用示例// 子组件中触发事件exportdefault{methods:{handleClick(){this.$emit(custom-event,payload data,{additional:info});}}}// 父组件中监听templatechild-component custom-eventhandleCustomEvent//templatescriptexportdefault{methods:{handleCustomEvent(data,extra){console.log(data);// payload dataconsole.log(extra);// { additional: info }}}}/script4. 事件命名规范使用 kebab-case短横线分隔命名如update-data避免使用原生 HTML 事件名如click防止混淆事件名应具有描述性体现业务含义三、$on方法详解1. 基本语法this.$on(event-name,callback)callback事件触发时执行的函数接收$emit传入的参数2. 工作原理$on方法将事件名和回调函数存储在组件实例的_events对象中同一个事件可以注册多个回调函数回调函数会按照注册顺序执行3. 实际应用示例// 组件内部监听自身事件exportdefault{created(){this.$on(internal-event,this.handleInternalEvent);},methods:{triggerInternal(){this.$emit(internal-event,data);},handleInternalEvent(data){console.log(Received:,data);}},beforeDestroy(){// 重要组件销毁前移除监听this.$off(internal-event,this.handleInternalEvent);}}4. 事件监听的生命周期管理最佳实践在beforeDestroy钩子中移除所有事件监听原因防止内存泄漏特别是当监听的是全局事件或跨组件事件时移除方法// 移除特定事件的特定监听器this.$off(event-name,callback);// 移除特定事件的所有监听器this.$off(event-name);// 移除所有事件的所有监听器this.$off();四、跨组件通信事件总线模式当组件层级较深或非父子关系时可以使用独立的事件总线Event Bus实现通信。1. 创建事件总线// event-bus.jsimportVuefromvue;exportconstEventBusnewVue();2. 使用示例// 组件A发布者import{EventBus}from./event-bus.js;exportdefault{methods:{sendNotification(){EventBus.$emit(notification,New message);}}}// 组件B订阅者import{EventBus}from./event-bus.js;exportdefault{created(){EventBus.$on(notification,this.handleNotification);},methods:{handleNotification(message){console.log(Received:,message);}},beforeDestroy(){EventBus.$off(notification,this.handleNotification);}}3. 事件总线的优缺点优点解耦组件关系简单易用适合小型项目无需引入额外状态管理库缺点随着项目增大事件管理会变得混乱难以追踪事件流和调试组件销毁时容易忘记移除监听五、高级用法与技巧1. 事件参数传递// 发布者this.$emit(multi-args,arg1,arg2,arg3);// 订阅者this.$on(multi-args,(a,b,c){console.log(a,b,c);// 依次输出三个参数});2. 事件对象传递Vue 会自动将原生事件对象作为最后一个参数传递如果监听的是原生事件// 自定义组件中this.$emit(custom-click,event);// event是原生事件对象// 父组件中child-component custom-clickhandleClick/methods:{handleClick(event){console.log(event.target);// 可以访问原生事件属性}}3. 异步事件处理// 发布者this.$emit(async-event);setTimeout((){this.$emit(async-event-complete);},1000);// 订阅者this.$on(async-event,(){console.log(Event started);});this.$on(async-event-complete,(){console.log(Event completed);});4. 一次性事件监听Vue 没有直接提供一次性监听的方法但可以手动实现constonceHandler(...args){console.log(This will only run once,args);EventBus.$off(one-time-event,onceHandler);};EventBus.$on(one-time-event,onceHandler);六、与 Vuex 的对比特性自定义事件Vuex数据流双向任意方向单向状态 → 组件调试难度较高难以追踪事件流较低有 DevTools 支持适合场景简单组件通信、小型项目复杂状态管理、大型应用状态持久性无有可持久化到 localStorage学习曲线低较高七、最佳实践总结组件内部通信优先使用 props 和$emit实现父子组件通信跨组件通信小型项目使用事件总线中大型项目考虑 Vuex 或 Pinia事件命名使用有意义的名称遵循 kebab-case 命名规范添加业务前缀如user/login内存管理组件销毁前移除所有事件监听避免在事件处理器中使用箭头函数难以移除性能考虑避免频繁触发的事件如 scroll、mousemove对高频事件使用防抖或节流八、常见问题解答1. 为什么我的事件监听不工作检查事件名是否匹配大小写敏感确保监听在事件触发前已经设置检查组件实例是否正确不要在 Vue 原型上调用$on2. 如何调试自定义事件使用 Vue DevTools 的 Events 选项卡在事件触发和监听处添加 console.log实现中央事件日志系统3. 可以传递对象作为事件参数吗完全可以Vue 会保留对象的引用this.$emit(data-update,{key:value});4. 事件总线可以替代 Vuex 吗不适合事件总线适合简单场景Vuex 提供了更强大的状态管理功能包括状态快照和回滚时间旅行调试插件系统模块化组织九、未来展望随着 Vue 3 的组合式 API 普及$emit和$on的使用方式保持不变但推荐使用setup()函数和emits选项来更明确地声明组件发出的事件exportdefault{emits:[custom-event],// 显式声明组件发出的事件setup(props,{emit}){consthandleClick(){emit(custom-event,data);// 使用解构的 emit 函数};return{handleClick};}}这种显式声明的方式提高了代码的可读性和可维护性特别是在大型项目中。结论$emit和$on是 Vue.js 中实现组件通信的基础工具通过发布订阅模式提供了灵活的事件机制。理解它们的内部工作原理和最佳实践可以帮助开发者构建更可维护、更高效的 Vue 应用。对于简单场景它们是轻量级的解决方案对于复杂应用则需要结合 Vuex 或 Pinia 等状态管理工具使用。无论选择哪种方式良好的事件命名规范和内存管理实践都是确保应用稳定性的关键。

相关文章:

详解 Vue.js 中的 $emit 与 $on:自定义事件的发布订阅模式

详解 Vue.js 中的 $emit 与 $on:自定义事件的发布订阅模式 在 Vue.js 的组件通信中,$emit 和 $on 是实现自定义事件发布订阅模式的核心方法。这种模式允许组件之间通过事件进行灵活的通信,特别适用于父子组件或非父子关系的组件间通信。本文将…...

跨平台算命APP源码开发:UniApp框架与微信小程序双端部署的命理服务解决方案

在移动互联网时代,命理服务与数字技术的融合催生了新型服务形态——跨平台算命APP。借助前沿的人工智能大语言模型(如GPT、DeepSeek等),算命APP将古老智慧与现代科技深度融合,通过精准的八字(四柱命理&…...

GLM-4.6V-Flash-WEB商业案例:电商商品图像智能描述与分类

GLM-4.6V-Flash-WEB商业案例:电商商品图像智能描述与分类 在电商行业蓬勃发展的今天,商品图像处理已成为提升转化率的关键环节。传统电商平台依赖人工编写商品描述和分类,不仅效率低下,还难以应对海量商品上架的需求。GLM-4.6V-F…...

GUI 之后,SaaS 该如何为 Agent 重写自己

从 CLI-Anything 现象看 bsin-paas 四块系统的 Agent 化设计CLI-Anything 在 GitHub 上拿到 15000 颗星的速度,让很多人感到意外。它做的事情说起来并不复杂:给任意桌面软件自动生成一套命令行接口,让 AI Agent 能直接用 CLI 操控 GIMP、Blen…...

定制化组装锂电池设备:精准匹配需求的技术实践

在新能源产业快速发展的背景下,锂电池作为核心储能元件,其应用场景已从消费电子扩展至新能源汽车、工业储能、便携式医疗设备等领域。不同行业对锂电池的性能参数、尺寸规格、安全标准提出了差异化要求,传统标准化电池产品难以满足多元化需求…...

StructBERT中文句子相似度实测:200字符长句、中英混排处理效果展示

StructBERT中文句子相似度实测:200字符长句、中英混排处理效果展示 1. 工具概述与核心能力 StructBERT是由百度研发的预训练语言模型,在中文自然语言处理任务中表现出色。本次实测的StructBERT文本相似度计算工具基于该模型实现,专门用于评…...

告别云端延迟:用TensorFlow Lite Micro在STM32上跑通你的第一个AI模型(附完整代码)

在STM32上部署TensorFlow Lite Micro模型的实战指南 从零开始:为什么选择嵌入式AI? 想象一下,你正在开发一款智能门锁,需要实时识别特定手势来解锁。如果每次识别都要把数据传到云端处理,不仅会有明显的延迟&#xff0…...

传统问卷设计VS书匠策AI:科研问卷的“智变”之旅

在科研的浩瀚海洋中,问卷设计宛如一座灯塔,为研究者指引着收集数据、探索真相的方向。然而,传统问卷设计方式常常让研究者们陷入繁琐的流程与无尽的纠结之中,从构思问题到排版布局,每一步都充满挑战。而如今&#xff0…...

具身智能:从感知到行动的认知闭环构建

在传统人工智能的叙事中,智能常被简化为“输入—处理—输出”的黑箱模型:给定数据,模型推理,给出答案。然而,这种“离身”(disembodied)的智能观正面临根本性质疑。越来越多的研究者意识到&…...

粒子群算法(PSO)优化层次分析法(AHP)的综合评价模型

粒子群算法(PSO)优化层次分析法(AHP)的综合评价模型 1. 引言 层次分析法(AHP)是一种多准则决策方法,通过构建判断矩阵并计算特征向量得到各因素的权重。但传统AHP依赖专家打分,判断矩阵可能不满足一致性要求(CR>0.1),且当指标较多时人工调整困难。粒子群算法(…...

告别复杂配置!SGLang-v0.5.6 Docker镜像快速部署,小白也能轻松搭建LLM服务

告别复杂配置!SGLang-v0.5.6 Docker镜像快速部署,小白也能轻松搭建LLM服务 1. 为什么选择SGLang? SGLang(Structured Generation Language)是一个专门为大语言模型(LLM)设计的推理框架。它解决…...

直流电机特性仿真:调压、弱磁、串电阻启动的Matlab GUI界面设计

直流电机特性仿真(调压 弱磁 串电阻启动)。 Matlab GUI界面设计。直流电机的仿真实验总带着点工程美学,尤其是当参数实时变化曲线在屏幕上扭出妖娆轨迹的时候。今天咱们抛开教科书上那些复杂的微分方程,直接在Matlab里搭个能互动的…...

OpenClaw 最热门使用技能 TOP 10

📊 核心技能榜1️⃣ Tavily Search — 搜索神器能干嘛:结构化搜索,Token消耗仅为传统的1/3谁在用:查技术文档、热点新闻、AI论文下载量:开发者最爱2️⃣ Playwright — 网页自动化能干嘛:模拟浏览器操作&am…...

告别重复劳作!n8n:技术团队的工作流自动化神器

作为技术从业者,你是否也曾陷入这样的困境:每天花费数小时在重复的数据同步、API调用、消息通知上,明明是可以自动化的机械操作,却占用了本该用于核心开发、创新突破的时间?从IT运维的员工入职流程,到安全团…...

腾讯云澄清高额费用系历史调用,但普通用户如何分清安装免费和使用收费的界限?这是否存在误导用户的嫌疑?

## 腾讯云“高额费用”事件:免费安装与付费使用的边界在哪里? 最近腾讯云因为“高额费用”的事情被推到了风口浪尖。官方解释说是历史调用导致的,但很多普通用户还是一头雾水:明明当初安装的时候说是免费,怎么突然就冒…...

SpringBoot策略模式实战:利用Map注入优雅管理多实现类

1. 为什么需要策略模式与Map注入 最近在重构一个图形处理系统时,我遇到了一个典型的多实现类问题。系统需要处理矩形、圆形、正方形等多种图形,每种图形都有自己的绘制逻辑。最初的做法是为每种图形创建单独的Service接口和实现类,结果代码迅…...

高仿网易云项目的笔记记录-day1

创建项目阶段使用先创建react项目再配置Ts的方法比较多弊端不推荐,所以采用直接配置Ts(通过react脚手架后同时配置TypeScript的支撑)create-react-app yingsheng_ts_react_music --template typescript——template typescript——&#xff…...

Fun-ASR-MLT-Nano-2512多语种识别实战:韩语K-pop歌词逐句转写演示

Fun-ASR-MLT-Nano-2512多语种识别实战:韩语K-pop歌词逐句转写演示 1. 项目概述 Fun-ASR-MLT-Nano-2512 是阿里通义实验室推出的多语言语音识别大模型,支持31种语言的高精度识别。这个模型特别适合处理各种语音转写场景,从日常对话到专业内容…...

Qwen2.5-VL-7B-Instruct开源大模型:16GB显存GPU实现企业级多模态推理

Qwen2.5-VL-7B-Instruct开源大模型:16GB显存GPU实现企业级多模态推理 想找一个既能看懂图片,又能和你流畅对话的AI助手,但被动辄几十GB的显存要求劝退?今天要介绍的Qwen2.5-VL-7B-Instruct,可能就是你在寻找的答案。 …...

从Java到AI大模型:一名传统开发者的转型之路

在技术浪潮翻涌的今天,人工智能大模型开发已成为最炙手可热的领域。作为一名Java开发者,我经常被问到:我们这些传统后端开发者,能否搭上这班AI快车?我的答案是:不仅能,而且我们有独特优势。 为什…...

使用Dify搭建工作流,实现自动化商品采集分析

最近用Dify做了一个工作流应用,可以实现自动化采集亚马逊商品信息,包括名称、价格、折扣、评分、评论等关键字段,然后使用DeepSeek对商品竞争力、价格、用户口碑进行分析,为跨境卖家提供一份完整的分析报告。 整个工作流搭建用到了…...

Compose 调用层参数设计规范(基于默认值复用原则)

Compose 调用层参数设计规范(基于默认值复用原则) 一、核心设计思想如果一个属性在大多数情况下都不变,就不应该在每个页面都去设置它。调用层(Page/Screen)职责:仅填充业务内容,不配置UI细节。…...

yz-bijini-cosplay创意应用:除了角色设计,它还能帮你做什么?

yz-bijini-cosplay创意应用:除了角色设计,它还能帮你做什么? 1. 项目概述:专为Cosplay优化的AI创作系统 yz-bijini-cosplay是一款基于通义千问Z-Image技术架构的AI图像生成系统,专门针对Cosplay创作场景进行了深度优…...

收藏!AI大模型爆发式增长,普通人零基础也能入局,程序员别再焦虑了!

最近刷技术圈、刷短视频,相信不少程序员和小白都被AI领域的“疯狂迭代”刷屏了。 从能自主行动、深度交互的人形机器人,到近期爆火、玩法不断刷新认知的OpenClaw AI小龙虾,这一波AI大模型的发展速度,用“日新月异”来形容都毫不为…...

dll修复工具,一键解决dll文件丢失、c++异常、软件打不开等问题

软件下载地址 各类修复工具大全 简介 相信很多朋友都会遇到“xxx.dll”丢失,软件启动不了、闪退等问题,说明你的系统缺少了支持的相关组件。今天要分享的软件是电脑DLL文件修复工具,强大且绿色,一键解决电脑dll文件丢失&#xf…...

InfluxDB时序数据库入门:从安装到第一个Measurement的完整指南

InfluxDB时序数据库实战:从零构建物联网数据监控系统 时序数据库正在成为物联网、DevOps和金融科技领域的核心技术栈。作为这一领域的佼佼者,InfluxDB以其高效的写入性能和灵活的数据模型,帮助开发者轻松应对海量时间序列数据的存储与分析挑战…...

收藏!小白程序员快速入门:AI Agent开发核心知识体系梳理

在 AI 技术日新月异的今天,AI Agent(智能体)正逐渐从概念走向落地。它不仅能进行对话,更具备了思考、规划和执行任务的能力。然而,构建一个成熟的 Agent 系统,并非简单的 API 调用,而是多种核心…...

AI智能二维码工坊扩展开发:自定义样式与颜色生成实战

AI智能二维码工坊扩展开发:自定义样式与颜色生成实战 1. 为什么需要“会变色”的二维码? 你有没有遇到过这些场景? 做品牌宣传海报时,黑白二维码和整体设计风格格格不入;给客户发电子名片,想让二维码带公…...

从零玩转全志T133-S3:手把手教你驱动ST7701S RGB长条屏(附LVGL分屏问题解决方案)

全志T133-S3驱动ST7701S长条屏实战指南:从硬件连接到LVGL分屏优化 在工业控制面板和智能家居终端设备中,非标准分辨率显示屏的应用越来越广泛。ST7701S驱动的RGB长条屏以其独特的显示比例和低功耗特性,成为HMI设计的理想选择。本文将深入探讨…...

Realistic Vision V5.1 前端交互开发:Vue3实现实时图像生成与预览界面

Realistic Vision V5.1 前端交互开发:Vue3实现实时图像生成与预览界面 最近在做一个挺有意思的项目,需要为团队内部部署的Realistic Vision V5.1模型搭建一个操作界面。这个模型生成的人像和场景图质量相当不错,但每次想调整参数、换个提示词…...