vue中的派发事件与广播事件,及广播事件应用于哪些场景和一个表单验证例子

news2025/6/8 17:25:22

在 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>`,	//模板,创建一个点击事件引用模式中的方法dispatchEvent
        methods:{
        	//事件函数
            dispatchEvent(){
            	//设置或叫创建自定义事件 custom-event,第2个是传递自定义事件的参数,传递给handleCustomEvent(message)
                this.$emit('custom-event','Hello my vue,this is from child');
            }
        }
    };
    const ParentComponent={
    //在模板中将子组件嵌入其中,并创建自定义custom-event事件绑定函数handleCustomEvent
        template:`<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.coloradmin.cn/o/2404363.html

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

相关文章

LabVIEW主轴故障诊断案例

LabVIEW 开发主轴机械状态识别与故障诊断系统&#xff0c;适配工业场景主轴振动监测需求。通过整合品牌硬件与软件算法&#xff0c;实现从信号采集到故障定位的全流程自动化&#xff0c;为设备维护提供数据支撑&#xff0c;提升数控机床运行可靠性。 ​ 面向精密制造企业数控机…

计算机组成与体系结构:补码数制二(Complementary Number Systems)

目录 4位二进制的减法 补码系统 &#x1f9e0;减基补码 名字解释&#xff1a; 减基补码有什么用&#xff1f; 计算方法 ❓为什么这样就能计算减基补码 &#x1f4a1; 原理揭示&#xff1a;按位减法&#xff0c;模拟总减法&#xff01; 那对于二进制呢&#xff1f;&…

C#使用MindFusion.Diagramming框架绘制流程图(2):流程图示例

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

【物联网-ModBus-RTU

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

Java应用10(客户端与服务器通信)

Java客户端与服务器通信 Java提供了多种方式来实现客户端与服务器之间的通信&#xff0c;下面我将介绍几种常见的方法&#xff1a; 1. 基于Socket的基本通信 服务器端代码 import java.io.*; import java.net.*;public class SimpleServer {public static void main(String…

Python_day47

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

如何在mac上安装podman

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

小黑一层层削苹果皮式大模型应用探索:langchain中智能体思考和执行工具的demo

引言 小黑黑通过探索langchain源码&#xff0c;设计了一个关于agent使用工具的一个简化版小demo&#xff08;代码可以跑通&#xff09;&#xff0c;主要流程&#xff1a; 1.问题输入给大模型。 2.大模型进行思考&#xff0c;输出需要执行的action和相关思考信息。 3.通过代理&…

阿里云ACP云计算备考笔记 (4)——企业应用服务

目录 第一章 企业应用概览 第二章 云解析 1、云解析基本概念 2、域名管理流程 3、云解析记录类型 4、域名管理 ① 开启注册局安全锁 ② 域名赎回 第二章 内容分发网络CDN 1、CDN概念 2、使用CDN前后对比 3、使用CDN的优势 4、阿里云CDN的优势 5、配置网页性能优化…

ARM SMMUv3简介(一)

1.概述 SMMU&#xff08;System Memory Management Unit&#xff0c;系统内存管理单元&#xff09;是ARM架构中用于管理设备访问系统内存的硬件模块。SMMU和MMU的功能类似&#xff0c;都是将虚拟地址转换成物理地址&#xff0c;不同的是MMU转换的虚拟地址来自CPU&#xff0c;S…

hadoop集群datanode启动显示init failed,不能解析hostname

三个datanode集群&#xff0c;有一个总是起不起来。去查看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…

浏览器工作原理05 [#] 渲染流程(上):HTML、CSS和JavaScript是如何变成页面的

引用 浏览器工作原理与实践 一、提出问题 在上一篇文章中我们介绍了导航相关的流程&#xff0c;那导航被提交后又会怎么样呢&#xff1f;就进入了渲染阶段。这个阶段很重要&#xff0c;了解其相关流程能让你“看透”页面是如何工作的&#xff0c;有了这些知识&#xff0c;你可…

|从零开始的Pyside2界面编程| 用Pyside2打造一个AI助手界面

&#x1f411; |从零开始的Pyside2界面编程| 用Pyside2打造一个AI助手界面 &#x1f411; 文章目录 &#x1f411; |从零开始的Pyside2界面编程| 用Pyside2打造一个AI助手界面 &#x1f411;♈前言♈♈调取Deepseek大模型♈♒准备工作♒♒调用API♒ ♈将模型嵌入到ui界面中♈♈…

pikachu靶场通关笔记20 SQL注入03-搜索型注入(GET)

目录 一、SQL注入 二、搜索型注入 三、源码分析 1、渗透思路1 2、渗透思路2 四、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入百分号单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取…

产品笔试专业名词梳理

目录 产品常识 四种常见广告形式 贴片广告 中插广告 信息流广告 横幅广告 BAT和TMD BAT TMD 付费渗透率 蓝海市场、红海市场 蓝海市场 红海市场 竞品研究 SWOT分析 SWOT分析的核心目的&#xff1a; SWOT分析的优点&#xff1a; SWOT分析的局限与注意事项&…

【前端】es6相关,柯里化

0. 严格模式 严格模式的概念从ES6引进。通过严格模式&#xff0c;可以在函数内部选择进行较为严格的全局或局部的错误条件检测。 MDN中严格模式的描述 严格模式通过抛出错误来消除了一些原有静默错误严格模式修复了一些导致 JavaScript引擎难以执行优化的缺陷&#xff1a;有时…

51单片机基础部分——矩阵按键检测

前言 上一节&#xff0c;我们说到了独立按键的检测以及使用&#xff0c;但是独立按键每一个按键都要对应一个IO口进行检测&#xff0c;在一些需要多按键的情况下&#xff0c;使用过多的独立按键会过多的占用单片机的IO资源&#xff0c;为了解决这个问题的出现&#xff0c;我们…

SpringBoot2.3.1集成Knife4j接口文档

首先要查看项目中pom文件里面有没有swagger和knife4j的依赖&#xff0c;如果有的话删除&#xff0c;加入以下依赖 <!-- swagger --><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-spring-boot-starter</…

容器安全最佳实践:云原生环境下的零信任架构实施

&#x1f4cb; 目录 引言&#xff1a;容器安全的重要性零信任架构基础理论云原生环境的安全挑战容器安全威胁模型分析零信任架构在容器环境中的实施关键技术组件与工具安全策略与最佳实践监控与响应机制案例研究与实施路径未来发展趋势 引言 随着容器技术和云原生架构的快速…

[BIOS]VSCode zx-6000 编译问题

前提&#xff1a;Python 3.6.6及以上版本安装成功&#xff0c;Python 3.6.6路径加到了环境变量# DEVITS工具包准备好 问题&#xff1a;添加环境变量 1&#xff1a;出现环境变量错误&#xff0c;“py -3” is not installed or added to environment variables #先在C:\Windows里…