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>
  1. @update:pwd:

@ 是 Vue 中用于监听事件的简写符号。
update:pwd 是一个自定义事件名称。update 是一个常见的前缀,用于表示数据更新的事件,而 pwd 是具体的字段名。

  1. pwd = $event:

pwd 是父组件 FormComponent 中定义的数据属性。
e v e n t 是 V u e 中的一个特殊变量,表示事件触发时传递的参数。在这里, event 是 Vue 中的一个特殊变量,表示事件触发时传递的参数。在这里, eventVue中的一个特殊变量,表示事件触发时传递的参数。在这里,event 是子组件 FieldComponent 通过 $emit(‘update:pwd’, this.field.value) 发出的值。
pwd = $event 是一个表达式,表示将子组件发出的值赋值给父组件的 pwd 属性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/86098.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云事件总线 EventBridge 正式商业化,构建智能化时代的企业级云上事件枢纽

作者&#xff1a;肯梦、稚柳 产品演进历程&#xff1a;在技术浪潮中的成长之路 早在 2018 年&#xff0c;Gartner 评估报告便将事件驱动模型&#xff08;Event-Driven Model&#xff09;列为十大战略技术趋势之一&#xff0c;指出事件驱动架构&#xff08;EDA&#xff0c;Eve…

《前端面试题:BFC(块级格式化上下文)》

前端BFC完全指南&#xff1a;布局魔法与面试必备 &#x1f38b; 端午安康&#xff01; 各位前端探险家&#xff0c;端午节快乐&#xff01;&#x1f96e; 愿你的代码如龙舟竞渡般乘风破浪&#xff0c;样式如香糯粽子般完美包裹&#xff01;今天我们来解锁CSS中的布局魔法——B…

dvwa10——XSS(DOM)

XSS攻击&#xff1a; DOM型XSS 只在浏览器前端攻击触发&#xff1a;修改url片段代码不存储 反射型XSS 经过服务器攻击触发&#xff1a;可能通过提交恶意表单&#xff0c;连接触发代码不存储 存储型XSS 经由服务器攻击触发&#xff1a;可能通过提交恶意表单&#xff0c;连…

跨平台资源下载工具:res-downloader 的使用体验

一款基于 Go Wails 的跨平台资源下载工具&#xff0c;简洁易用&#xff0c;支持多种资源嗅探与下载。res-downloader 一款开源免费的下载软件(开源无毒、放心使用)&#xff01;支持Win10、Win11、Mac系统.支持视频、音频、图片、m3u8等网络资源下载.支持视频号、小程序、抖音、…

AOSP CachedAppOptimizer中的冻结和内存压缩功能

AOSP CachedAppOptimizer&#xff1a;应用进程长期处于 Cached 状态的内存压缩和冻结优化管控 冻结和内存压缩两个功能独立触发&#xff0c;可以单独触发也可以组合触发&#xff0c;默认顺序&#xff1a;先压缩&#xff0c;后冻结 public class OomAdjuster { protected b…

相机--相机成像原理和基础概念

教程 成像原理 基础概念 焦距&#xff08;物理焦距&#xff09; 镜头的光学中心到感光元件之间的距离&#xff0c;用f表示&#xff0c;单位&#xff1a;mm&#xff1b;。 像素焦距 相机内参矩阵中的 fx​ 和 fy​ 是将物理焦距转换到像素坐标系的产物&#xff0c;可能不同。…

Vue3项目实现WPS文件预览和内容回填功能

技术方案背景&#xff1a;根据项目需要&#xff0c;要实现在线查看、在线编辑文档&#xff0c;并且进行内容的快速回填&#xff0c;根据这一项目背景&#xff0c;最终采用WPS的API来实现&#xff0c;接下来我们一起来实现项目功能。 1.首先需要先准备好测试使用的文档&#xf…

汇编语言学习(三)——DoxBox中debug的使用

目录 一、安装DoxBox&#xff0c;并下载汇编工具&#xff08;MASM文件&#xff09; 二、debug是什么 三、debug中的命令 一、安装DoxBox&#xff0c;并下载汇编工具&#xff08;MASM文件&#xff09; 链接&#xff1a; https://pan.baidu.com/s/1IbyJj-JIkl_oMOJmkKiaGQ?pw…

关于DDOS

DDOS是一门没什么技术含量的东西&#xff0c;其本质而言是通过大量数据报文&#xff0c;发送到目标受害主机IP地址上&#xff0c;导致目标主机无法继续服务&#xff08;俗称&#xff1a;拒绝服务&#xff09; DDOS灰产人期望达成的预期目标&#xff0c;几乎都是只要把对面打到 …

Modbus转Ethernet IP网关助力罗克韦尔PLC数据交互

在工业自动化领域&#xff0c;Modbus协议是一种广泛应用的串行通信协议&#xff0c;它定义了主站和从站之间的通信规则和数据格式。罗克韦尔PLC是一种可编程的逻辑控制器&#xff0c;通过Modbus协议实现与其他设备之间的数据交互。然而&#xff0c;随着以太网技术的普及和发展&…

C# winform教程(二)----button

一、button的使用方法 主要使用方法几乎都在属性内&#xff0c;我们操作也在这个界面 二、作用 用户点击时触发事件&#xff0c;事件有很多种&#xff0c;可以根据需要选择。 三、常用属性 虽然属性很多&#xff0c;但是常用的并不多 3.常用属性 名称内容含义AutoSize自动调…

【 java 基础问题 第二篇 】

目录 1.深拷贝和浅拷贝 1.1.区别 定义 定义 1.2.实现深拷贝的方式 2.泛型 2.1.定义 2.2.作用 3.对象 3.1.创建对象的方式 3.2.对象回收 3.3. 获取私有成员 4.反射 4.1.定义 4.2.特性 4.3.原理 5.异常 5.1.异常的种类 5.2.处理异常的方法 6.Object 6.1.等于与…

Kafka 入门指南与一键部署

Kafka 介绍 想象一下你正在运营一个大型电商平台&#xff0c;每秒都有成千上万的用户浏览商品、下单、支付&#xff0c;同时后台系统还在记录用户行为、更新库存、处理物流信息。这些海量、持续产生的数据就像奔腾不息的河流&#xff0c;你需要一个强大、可靠且实时的系统来接…

湖北理元理律师事务所:企业债务重组的风险控制方法论

一、担保链破解&#xff1a;阻断债务传染的核心技术 2023年武汉某建材公司案例&#xff1a; 原始债务结构&#xff1a; A公司&#xff08;主债务人&#xff09;欠款200万 ↓ B公司&#xff08;担保人&#xff09;←连带责任触发执行 ↓ C公司&#xff08;B公司担…

如何在CloudCompare中打开pcd文件

你只需要将pcd文件的路径改在全英文路径下&#xff0c;CloudCompare就可以打开。若含中文&#xff0c;就会报错&#xff1a;

中医的十问歌和脉象分类

中医核心理论框架如下 诊断技术如下 本文主要介绍问诊和切诊。 十问歌的“十”是虚指&#xff0c;实际包含12个核心问题&#xff0c;脉象28种中常见仅10余种&#xff0c;重点解释脉诊的物理本质&#xff08;血流动力学触觉感知&#xff09; 以下是中医十问歌的完整内容及脉…

基于智能代理人工智能(Agentic AI)对冲基金模拟系统:模范巴菲特、凯西·伍德的投资策略

股票市场涉及众多统计数据和模式。股票交易基于研究和数据驱动的决策。人工智能的使用可以实现流程自动化&#xff0c;让投资者在研究上花费更少的时间&#xff0c;同时提高准确性。这使他们能够更加专注于监督实际交易和服务客户。 顶尖对冲基金经理发挥着至关重要的作用&…

大二下期末

一.Numpy&#xff08;Numerical Python&#xff09; Numpy库是Python用于科学计算的基础包&#xff0c;也是大量Python数学和科学计算包的基础。不少数据处理和分析包都是在Numpy的基础上开发的&#xff0c;如后面介绍的Pandas包。 Numpy的核心基础是ndarray&#xff08;N-di…

D3ctf-web-d3invitation单题wp

#注入 #用kali构造凭证访问MinIO服务器 #用mc带临时凭证访问远程Minion的储存桶 还有一个 minio 服务的api&#xff0c;我们后面要用 /static/js/tools.js function generateInvitation(user_id, avatarFile) {if (avatarFile) {object_name avatarFile.name;genSTSCreds(ob…

基于 Vue 和 Spring Boot 实现滑块验证码的机器验证

基于 Vue 和 Spring Boot 实现滑块验证码的机器验证 需求概述技术选型前端实现1. 引入组件2. 修改后端请求URL3. 新增机器验证页面4.首页调用验证组件 后端实现流程梳理具体实现1. 引入依赖2. 增加yml配置3. 代码实现4.跨域配置&#xff08;可选&#xff09; 实现效果二次验证的…