vue中的派发事件与广播事件,及广播事件应用于哪些场景和一个表单验证例子
在 Vue 2.X 中,$dispatch 和 $broadcast 方法已经被废弃。官方认为基于组件树结构的事件流方式难以理解,并且在组件结构扩展时容易变得脆弱。因此,Vue 2.X 推荐使用其他方式来实现组件间的通信,例如通过 $emit 和 $on 方法,或者使用事件总线(Event Bus)
子组件向上派发事件 ,然后父组件会收到来自子组件发来的信息
<div id="app"><div><my-fade></my-fade></div>
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.13/vue.js"></script>
<script>//子组件const ChildComponent={template:`<div><h4>子组件</h4><button @click="dispatchEvent">派发事件</button></div>`, //模板,创建一个点击事件引用模式中的方法dispatchEventmethods:{//事件函数dispatchEvent(){//设置或叫创建自定义事件 custom-event,第2个是传递自定义事件的参数,传递给handleCustomEvent(message)this.$emit('custom-event','Hello my vue,this is from child');}}};const ParentComponent={//在模板中将子组件嵌入其中,并创建自定义custom-event事件绑定函数handleCustomEventtemplate:`<div><h3>父组件</h3><p>接收到消息:{{message}}</p><child-component @custom-event="handleCustomEvent"></child-component></div>`,data(){return {message:''};},methods:{//这里的参数message就是自定义事件中custom-event的参数handleCustomEvent(message){this.message=message;console.log(this.message);}},components:{// 在父组件中注册子组件'child-component':ChildComponent} };const app=new Vue({el:"#app",components:{'my-fade':ParentComponent}});
</script>
以下是派发事件,及父组件广播给所有子组件
<div id="app"><parent-component></parent-component>
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.13/vue.js"></script>
<script>//设置子组件const ChildComponent={template:`<div><h3>子组件</h3><p>接收到消息:{{message}}</p></div> `,data(){return {message:''};},methods:{//主要作为是触发自定义事件时设置message的值handleBroadcast(message){this.message=message;}},mounted(){//$on主要用途即为监听自定义事件this.$on('broadcast-event',this.handleBroadcast);},//在组件消毁前移除监听beforeDestroy(){this.$off('broadcast-event',this.handleBroadcast);}};//设置父组件const ParentComponent={template:`<div><h3>父组件</h3><button @click="broadcastEvent">广播事件</button><child-component></child-component> //嵌入子组件</div>`,components:{//在父组件中注册子组件'child-component':ChildComponent},methods:{broadcastEvent(){this.$children.forEach((child)=>{if(child.handleBroadcast){//设置自定义事件broadcast-event,并传递hello from Parent这个参数child.$emit('broadcast-event','Hello from Parent')}})}} };const app=new Vue({el:"#app",components:{'parent-component':ParentComponent}})
</script>
广播事件的典型使用场景
- 表单验证
场景描述:在复杂的表单中,可能有多个子组件负责不同的表单字段验证。父组件可以通过广播事件通知所有子组件进行验证操作。
实现方式:父组件触发一个广播事件(如 validate),所有子组件监听该事件并执行各自的验证逻辑。
- 更新状态
场景描述:父组件需要更新多个子组件的状态,例如在购物车页面中,父组件需要通知所有子组件更新商品数量或价格。
实现方式:父组件广播一个事件(如 update-cart),子组件监听该事件并根据传递的数据更新自身状态。
- 动态数据同步
场景描述:在多级嵌套的组件结构中,父组件需要将动态数据同步到多个子组件中。
实现方式:父组件通过广播事件将数据传递给所有子组件,子组件接收数据并更新视图。
- UI 状态更新
场景描述:父组件需要统一更新多个子组件的 UI 状态,例如在多级菜单中,父组件需要通知所有子菜单项更新显示状态。
实现方式:父组件广播一个事件(如 toggle-menu),子组件监听该事件并根据传递的参数更新显示状态。
- 数据刷新
场景描述:在数据列表中,父组件需要通知所有子组件刷新数据,例如在用户管理页面中,父组件需要通知所有子组件重新加载用户数据。
实现方式:父组件广播一个事件(如 refresh-data),子组件监听该事件并调用数据加载方法。
- 示例:表单验证场景
假设有一个表单,包含多个子组件,每个子组件负责一个表单字段的验证。父组件需要在提交表单时触发所有子组件的验证逻辑。
<div id="app"><form-component></form-component>
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.13/vue.js"></script>
<script>const FieldComponent={//从父组件中获取到field,pwd,pwd2他们的值//@blur失去焦点时触发props:['field','pwd','pwd2'],template:`<div><label :for="field.id">{{field.label}}</label><input :id="field.id" v-model="field.value" :type="field.type" :name="field.id" @blur="validateField" autocomplete="false"><span v-if="field.error" style="color:red;">{{field.error}}</span></div>`,methods:{//验证函数validateField(){if(!this.field.value){this.field.error='此字段必填';}else{switch(this.field.id){case 'username':if(this.field.value.length<4 || this.field.value>21){this.field.error='用户名字符在4-21之间';}else{this.field.error='';}break;case 'pwd':let regex=/[A-Z]/g;if(this.field.value.length<6 || !regex.test(this.field.value)){this.field.error='密码必须大于6个字符,并包含大写字母';}else{this.field.error='';console.log(this.field.value);//设置自定义更新事件,即pwd更新时触发this.$emit('update:pwd',this.field.value);} break;case 'pwd2':if(this.field.value != this.pwd){this.field.error='两次密码不一致';}else{this.field.error='';} break;case 'email':if(!this.field.value.includes('@')){this.field.error='邮箱不正确';}else{this.field.error='';} break;}}}},mounted(){//监听自定义validate事件,并触发验证函数this.$on('validate',this.validateField);},//在消毁前注销掉事件beforDestroy(){this.$off('validate',this.validateField);} };const FormComponent={//父组件模板,嵌入子组件<field-component 并循环fields数据//@update:pwd即自定义更新事件,getPwd为函数用于设置pwd更新后的值,也可以直接写成@update:pwd="pwd=$event"template:`<form @submit.prevent="submitForm"><field-component v-for="field in fields" :key="field.id" :field="field" :pwd="pwd" :pwd2="pwd2" @update:pwd="getPwd"></field-component><button type='submit'>提交</button></form> `,components:{//注册字段子组伯'field-component':FieldComponent} ,data(){return{fields:[{id:'username',label:'用户:',type:'text',value:'',error:''},{id:'pwd',label:'密码:',type:'password',value:'',error:''},{id:'pwd2',label:'重复:',type:'password',value:'',error:''},{id:'email',label:'邮箱:',type:'email',value:'',error:''}],pwd:'', //pwd,pwd2主要作用是为了在验证他们是否相等时使用pwd2:''}},methods:{//在提交时触发的函数submitForm(){this.$children.forEach((child)=>{if(child.validateField){//在子组件中触发自定义的验证函数child.$emit('validate');}});//如果在有一个field.error为真,即会大子组件字段中显示const hasErrors=this.fields.some((field)=>field.error);if(!hasErrors){alert('表单提交成功');}},getPwd(val){this.pwd=val;}} }const app=new Vue({el:"#app",components:{'form-component':FormComponent}});
</script>
- @update:pwd:
@ 是 Vue 中用于监听事件的简写符号。
update:pwd 是一个自定义事件名称。update 是一个常见的前缀,用于表示数据更新的事件,而 pwd 是具体的字段名。
- pwd = $event:
pwd 是父组件 FormComponent 中定义的数据属性。
e v e n t 是 V u e 中的一个特殊变量,表示事件触发时传递的参数。在这里, event 是 Vue 中的一个特殊变量,表示事件触发时传递的参数。在这里, event是Vue中的一个特殊变量,表示事件触发时传递的参数。在这里,event 是子组件 FieldComponent 通过 $emit(‘update:pwd’, this.field.value) 发出的值。
pwd = $event 是一个表达式,表示将子组件发出的值赋值给父组件的 pwd 属性。
相关文章:
vue中的派发事件与广播事件,及广播事件应用于哪些场景和一个表单验证例子
在 Vue 2.X 中,$dispatch 和 $broadcast 方法已经被废弃。官方认为基于组件树结构的事件流方式难以理解,并且在组件结构扩展时容易变得脆弱。因此,Vue 2.X 推荐使用其他方式来实现组件间的通信,例如通过 $emit 和 $on 方法&#x…...
DeepSeek 赋能智能养老:情感陪伴机器人的温暖革新
目录 一、引言二、智能养老情感陪伴机器人的市场现状与需求2.1 市场现状2.2 老年人情感陪伴需求分析 三、DeepSeek 技术详解3.1 DeepSeek 的技术特点3.2 与其他类似技术的对比优势 四、DeepSeek 在智能养老情感陪伴机器人中的具体应用4.1 自然语言处理与对话交互4.2 情感识别与…...

LabVIEW主轴故障诊断案例
LabVIEW 开发主轴机械状态识别与故障诊断系统,适配工业场景主轴振动监测需求。通过整合品牌硬件与软件算法,实现从信号采集到故障定位的全流程自动化,为设备维护提供数据支撑,提升数控机床运行可靠性。 面向精密制造企业数控机…...
gRPC 的四种通信模式完整示例
gRPC 的四种基本通信模式,包括完整的 .proto 文件定义和 Go 语言实现代码: 1. 简单 RPC (Unary RPC) - 请求/响应模式 客户端发送单个请求,服务端返回单个响应 calculator.proto protobuf syntax "proto3";package calculato…...
C#中Struct与IntPtr转换:实用扩展方法
C#中Struct与IntPtr转换:实用扩展方法 在 C# 编程的世界里,我们常常会遇到需要与非托管代码交互,或者进行一些底层内存操作的场景。这时,IntPtr类型就显得尤为重要,它可以表示一个指针或句柄,用来指向非托…...
Web安全:XSS、CSRF等常见漏洞及防御措施
Web安全:XSS、CSRF等常见漏洞及防御措施 一、XSS(跨站脚本攻击) 定义与原理 XSS攻击指攻击者将恶意脚本(如JavaScript、HTML标签)注入到Web页面中,当用户访问该页面时,脚本在浏览器端执行&…...
Java基础之数组(附带Comparator)
文章目录 基础概念可变参数组数组与ListComparator类1,基本概念2,使用Comparator的静态方法(Java 8)3,常用Comparator方法4,例子 排序与查找数组复制其他 基础概念 int[] anArray new int[10];只有创建对象时才会使用new关键字,所以数组是个…...

计算机组成与体系结构:补码数制二(Complementary Number Systems)
目录 4位二进制的减法 补码系统 🧠减基补码 名字解释: 减基补码有什么用? 计算方法 ❓为什么这样就能计算减基补码 💡 原理揭示:按位减法,模拟总减法! 那对于二进制呢?&…...

C#使用MindFusion.Diagramming框架绘制流程图(2):流程图示例
上一节我们初步介绍MindFusion.Diagramming框架 C#使用MindFusion.Diagramming框架绘制流程图(1):基础类型-CSDN博客 这里演示示例程序: 新建Windows窗体应用程序FlowDiagramDemo,将默认的Form1重命名为FormFlowDiagram. 右键FlowDiagramDemo管理NuGet程序包 输入MindFusio…...

【物联网-ModBus-RTU
物联网-ModBus-RTU ■ 优秀博主链接■ ModBus-RTU介绍■(1)帧结构■(2)查询功能码 0x03■(3)修改单个寄存器功能码 0x06■(4)Modbus RTU 串口收发数据分析 ■ 优秀博主链接 Modbus …...

Java应用10(客户端与服务器通信)
Java客户端与服务器通信 Java提供了多种方式来实现客户端与服务器之间的通信,下面我将介绍几种常见的方法: 1. 基于Socket的基本通信 服务器端代码 import java.io.*; import java.net.*;public class SimpleServer {public static void main(String…...
STM32学习之I2C(理论篇)
📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…...
【C/C++】algorithm清单以及适用场景
文章目录 algorithm清单以及适用场景1 算法介绍1.1 分类1.2 非修改序列算法1.3 修改序列算法1.4 排序与堆算法1.5 集合操作算法(要求有序)1.5 查找算法1.6 二分查找算法(有序区间)1.7 去重与分区算法1.8 数值算法 <numeric>…...

Python_day47
作业:对比不同卷积层热图可视化的结果 一、不同卷积层的特征特性 卷积层类型特征类型特征抽象程度对输入的依赖程度低层卷积层(如第 1 - 3 层)边缘、纹理、颜色、简单形状等基础特征低高,直接与输入像素关联中层卷积层(…...

如何在mac上安装podman
安装 Podman 在 macOS 上 在 macOS 上安装 Podman 需要使用 Podman 的桌面客户端工具 Podman Desktop 或通过 Homebrew 安装命令行工具。 使用 Homebrew 安装 Podman: (base) ninjamacninjamacdeMacBook-Air shell % brew install podman > Auto-updating Hom…...

小黑一层层削苹果皮式大模型应用探索:langchain中智能体思考和执行工具的demo
引言 小黑黑通过探索langchain源码,设计了一个关于agent使用工具的一个简化版小demo(代码可以跑通),主要流程: 1.问题输入给大模型。 2.大模型进行思考,输出需要执行的action和相关思考信息。 3.通过代理&…...
CppCon 2015 学习:Intro to the C++ Object Model
这段代码展示了使用 make 工具来编译 C 程序的简单过程。 代码和步骤解析: C 代码(intro.cpp):#include <iostream> int main() { std::cout<<"hello world\n"; } 这是一个简单的 C 程序,它包…...
Go 语言中的 make 函数详解
Go 语言中的 make 函数详解 make 是 Go 语言中的一个内置函数,用于初始化切片(slice)、映射(map)和通道(channel)这些引用类型。这些类型必须在使用前通过 make 初始化&#x…...

阿里云ACP云计算备考笔记 (4)——企业应用服务
目录 第一章 企业应用概览 第二章 云解析 1、云解析基本概念 2、域名管理流程 3、云解析记录类型 4、域名管理 ① 开启注册局安全锁 ② 域名赎回 第二章 内容分发网络CDN 1、CDN概念 2、使用CDN前后对比 3、使用CDN的优势 4、阿里云CDN的优势 5、配置网页性能优化…...
用 NGINX 构建高效 SMTP 代理`ngx_mail_smtp_module`
一、模块定位与作用 协议代理 NGINX 监听指定端口(如 25、587、465 等),接收客户端的 SMTP 会话请求。代理层在会话中透明转发客户端的 EHLO、MAIL FROM、RCPT TO、DATA 等命令到后端 MTA。 认证控制 通过 smtp_auth 指令指定允许的 SASL 认…...
【前端】常用组件的CSS
1. button的样式修改 每个环节有五个不同的状态:link,hover,active,focus和visited. Link是正常的外观,hover当你鼠标悬停时,active是单击它时的状态,focus跟随活动状态,visited是你在最近点击的链接未聚焦时结束的状态。 纯CSS 以下为例子,按下后从浅紫到深紫。注…...
【华为云学习与认证】以华为云物联网为基座的全栈开发(从物联网iot平台模块到应用展示、数据分析、机器学习、嵌入式开发等)的系统性学习与认证路线
总目标 学习以华为云物联网为基座的全栈开发(从物联网iot平台模块到应用展示、数据分析、机器学习、嵌入式开发等)的系统性学习与认证路线。计划包含阶段学习、技术文档、实操实际操作、开发路径与考证规划,提供职业生涯基础性规划。 注意&…...
OpenCV 键盘响应来切换图像
一、知识点 1、int waitKey(int delay 0); (1)、等待按键。 等待指定的毫秒数,返回按键的ASCII码。 (2)、返回值: int型,表示按键ASCII码。 若没有按键,指定时间过去,返回-1。 (3)、参数delay: 等待时间,单位毫…...

ARM SMMUv3简介(一)
1.概述 SMMU(System Memory Management Unit,系统内存管理单元)是ARM架构中用于管理设备访问系统内存的硬件模块。SMMU和MMU的功能类似,都是将虚拟地址转换成物理地址,不同的是MMU转换的虚拟地址来自CPU,S…...
C#提取CAN ASC文件时间戳:实现与性能优化
C#提取CAN ASC文件时间戳:实现与性能优化 在汽车电子和工业控制领域,CAN总线是最常用的通信协议之一。而ASC(ASCII)文件作为CAN总线数据的标准日志格式,广泛应用于数据记录和分析场景。本文将深入探讨如何高效地从CAN…...

hadoop集群datanode启动显示init failed,不能解析hostname
三个datanode集群,有一个总是起不起来。去查看log显示 Initialization failed for Block pool BP-1920852191-192.168.115.154-1749093939738 (Datanode Uuid 89d9df36-1c01-4f22-9905-517fee205a8e) service to node154/192.168.115.154:8020 Datanode denied com…...
Android 视图系统入门指南
1. View:界面的最小单位 本质:屏幕上的一个矩形区域,能显示内容或接收触摸。比喻:就像乐高积木,是组成界面的最小单位。常见子类: TextView(文字积木)、Button(按钮积木…...

浏览器工作原理05 [#] 渲染流程(上):HTML、CSS和JavaScript是如何变成页面的
引用 浏览器工作原理与实践 一、提出问题 在上一篇文章中我们介绍了导航相关的流程,那导航被提交后又会怎么样呢?就进入了渲染阶段。这个阶段很重要,了解其相关流程能让你“看透”页面是如何工作的,有了这些知识,你可…...
青少年编程与数学 01-011 系统软件简介 03 NetWare操作系统
青少年编程与数学 01-011 系统软件简介 03 NetWare操作系统 一、历史背景二、核心架构三、关键功能四、管理工具五、客户端支持六、版本演变七、衰落原因八、遗产与影响总结 摘要:NetWare 是早期网络操作系统的巅峰之作,其高性能文件服务、目录管理和容错…...
AI编程提示词
你是 IDE 的 AI 编程助手,遵循核心工作流(研究 -> 构思 -> 计划 -> 执行 -> 评审)用中文协助用户,面向专业程序员,交互应简洁专业,避免不必要解释。[沟通守则] 1. 响应以模式标签 [模式&#…...