Props 和 Events(父子组件通信)

  • Props:父组件向子组件传递数据使用 props。子组件通过声明 props 来接收来自父组件的数据。

    <!-- 父组件 -->
    <template><ChildComponent :message="parentMessage" />
    </template><script>
    import ChildComponent from './ChildComponent.vue';export default {components: { ChildComponent },data() {return {parentMessage: 'Hello from parent'};}
    };
    </script>
    <!-- 子组件 -->
    <template><div>{{ message }}</div>
    </template><script>
    export default {props: ['message']
    };
    </script>
  • Events:子组件向父组件发送消息或数据可以使用 $emit 方法触发自定义事件。

    <!-- 子组件 -->
    <template><button @click="sendMessage">Send Message</button>
    </template><script>
    export default {methods: {sendMessage() {this.$emit('childEvent', 'Hello from child');}}
    };
    </script>
    <!-- 父组件 -->
    <template><ChildComponent @childEvent="handleChildEvent" />
    </template><script>
    import ChildComponent from './ChildComponent.vue';export default {components: { ChildComponent },methods: {handleChildEvent(message) {console.log(message);}}
    };
    </script>

ChildComponent.vue,它需要向父组件发送两个参数:messagestatus

<template><button @click="sendDataToParent">Send Data to Parent</button>
</template><script>
export default {data() {return {message: 'Hello from Child',status: 'success'};},methods: {sendDataToParent() {// 使用 $emit 触发自定义事件,并传递多个参数this.$emit('dataFromChild', this.message, this.status);}}
};
</script>

在这个例子中,当按钮被点击时,会调用 sendDataToChild 方法,该方法使用 $emit 来触发名为 dataFromChild 的自定义事件,并传递了两个参数:this.messagethis.status

父组件代码

接下来,在父组件中引入 ChildComponent 并监听 dataFromChild 事件。

<template><div><!-- 监听来自子组件的自定义事件 --><ChildComponent @dataFromChild="handleDataFromChild" /></div>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: { ChildComponent },methods: {handleDataFromChild(message, status) {console.log('Message:', message); // 输出: Hello from Childconsole.log('Status:', status);   // 输出: success// 在这里处理接收到的数据}}
};
</script>

在这个父组件的例子中,@dataFromChild="handleDataFromChild" 表示监听子组件发出的 dataFromChild 事件,并在事件发生时调用 handleDataFromChild 方法。此方法接收子组件传递过来的参数(在这个例子中是 messagestatus),然后可以根据业务需求对这些数据进行处理。

这种方法可以让你轻松地在子组件和父组件之间传递任意数量的参数。只需要确保在 $emit 调用时传递正确的参数,并在父组件的方法中正确接收它们即可

父组件在监听子组件事件的同时,还需要传递自己的参数

  • 子组件通过 $emit 触发事件,传递自己的数据(如:childData)。
  • 父组件监听该事件,同时还想传入自己的参数(如:parentIdcategory 等)。
  • 最终父组件的处理函数需要 同时拿到子组件的数据 + 父组件自己的参数

 方法一:使用内联箭头函数(推荐)

这是最清晰、最常用的方式。

<!-- 父组件 ParentComponent.vue -->
<template><div><!-- 使用箭头函数包装,同时传入父组件参数 --><ChildComponent@dataFromChild="(childData) => handleData(childData, parentId, 'user')"/></div>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: { ChildComponent },data() {return {parentId: 1001,};},methods: {handleData(childData, parentId, type) {console.log('来自子组件的数据:', childData);console.log('父组件自己的参数:', parentId, type);// 处理逻辑...}}
};
</script>

✅ 优点:语义清晰,支持传任意多个父参数。


 方法二:使用包装函数(命名函数)

如果你不想用内联箭头函数,也可以封装一个中间函数。

<template><ChildComponent @dataFromChild="wrapperHandler" />
</template><script>
export default {data() {return {parentId: 1001,};},methods: {wrapperHandler(childData) {// 在这里调用真正的处理函数,并传入父组件参数this.handleData(childData, this.parentId, 'admin');},handleData(childData, parentId, role) {console.log(childData, parentId, role);}}
};
</script>

✅ 优点:逻辑分离,适合复杂逻辑。


✅ 方法三:使用 $event 隐式变量(传统方式)

Vue 会把 $emit 的第一个参数自动传给监听函数,可以用 $event 接收。

<template><ChildComponent @dataFromChild="handleData($event, parentId, 'guest')" />
</template><script>
export default {data() {return {parentId: 1001,};},methods: {handleData(childData, parentId, userType) {console.log(childData, parentId, userType);}}
};
</script>

⚠️ 注意:$event 是子组件 $emit 传递的第一个参数。如果有多个参数,$event 只是第一个。如果要传递多个,可以把参数包装成一个对象.

<!-- ChildComponent.vue -->
<template><button @click="sendData">Send Data</button>
</template><script>
export default {methods: {sendData() {this.$emit('dataFromChild', {name: 'Alice',age: 25});}}
};
</script>

✅ 总结

方法说明推荐度
内联箭头函数 (data) => handler(data, param)最灵活,推荐⭐⭐⭐⭐⭐
包装函数逻辑清晰,适合复杂处理⭐⭐⭐⭐☆
$event + 参数传统写法,稍显隐晦⭐⭐⭐☆☆

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

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

相关文章

PCL学习之路-基础知识-(一)

文章目录1.西门子S7系列PLC类型划分(1).大型PLC&#xff1a;S7-400(2).中型PLC&#xff1a;S7-300(3).小型PLC&#xff1a;S7-200系列2.西门子S7外形结构(1).总览&#xff1a;PLC的“器官”分工逻辑3.输出电路(1).小型继电器输出形式(2).大功率晶体管/场效应管输出形式(3).双向…

leetcode654:最大二叉树(递归与单调栈双解法)

文章目录一、 题目描述二、 核心思路&#xff1a;分而治之与递归构造三、代码实现与深度解析四、 关键点与复杂度分析五、拓展解法单调栈解法两种解法对比LeetCode 654. 最大二叉树&#xff0c;【难度&#xff1a;中等&#xff1b;通过率&#xff1a;82.6%】&#xff0c;这道题…

Python 循环语法详解

在编程中&#xff0c;循环是一种非常常见的控制结构。很多时候&#xff0c;我们需要重复做一些事情&#xff0c;比如遍历列表、处理数据、尝试直到成功等。这时候&#xff0c;就离不开循环了。Python 提供了两种主要的循环结构&#xff1a;for 循环 和 while 循环。本篇文章会从…

一个小巧神奇的 USB数据线检测仪

一个小巧的数据线检测仪&#xff0c;检测各种USB数据线是否损坏、通断&#xff0c;TYPE_C、MICRO_B、苹果线、烧录线、网线都可检测。嵌入式开发者的称手工具。 这个是我个人制作的&#xff0c;SMT和连接器比较贵&#xff0c;特别是24PIN的C口连接器&#xff0c;我挂在黄色小鱼…

37.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--扩展功能--增加Github Action

在第二部分&#xff08;微服务基础工具与技术&#xff09;中我们讲解了GitHub Action的相关知识&#xff0c;那么在这一节中&#xff0c;我们将为已有的微服务增加GitHub Action的支持。 一、什么是GitHub Action 虽然前面已经介绍过GitHub Action的相关知识&#xff0c;但这里…

ROS2 通过 命令行 发布速度控制指令 控制 麦克娜姆轮

在 ROS2 中&#xff0c;要通过命令行发布速度控制指令来控制麦克娜姆轮机器人&#xff0c;你需要知道机器人所使用的速度控制话题和消息类型。通常麦克娜姆轮机器人使用geometry_msgs/Twist消息类型来接收速度指令。 以下是通过命令行发布速度控制指令的方法&#xff1a; 首先确…

多层Model更新多层ListView

一、总体架构QML (三层 ListView)└─ C 单例 DataCenter (QQmlContext 注册)├─ L1Model (一级节点)│ └─ 内部持有 QList<L2Model*>│ └─ L2Model (二级节点)│ └─ 内部持有 QList<L3Model*>│ └─ L3Model (三级节…

Git基础操作教程

本文目的是掌握Git基础操作教程一、Git简介Git&#xff1a;分布式版本控制系统&#xff0c;使用仓库(Repository)来记录文件的变化最流行的版本控制系统有两种&#xff1a;集中式&#xff08;SVN&#xff09;、分布式&#xff08;Git&#xff09;二、Git操作1.创建仓库仓库(Rep…

Android 之 Kotlin

变量变量的声明Kotlin使用var&#xff0c;val来声明变量&#xff0c;注意&#xff1a;Kotlin不再需要;来结尾var 可变变量&#xff0c;对应java的非final变量var b 1val不可变变量&#xff0c;对应java的final变量val a 1两种变量并未声明类型&#xff0c;这是因为Kotlin存在…

Design Compiler:布图规划探索(ICC)

相关阅读 Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482 简介 在Design Compiler Graphical中&#xff0c;可以用布图规划探索(Floorplan Exploration)功能&#xff0c;打开IC Compiler进行布图规划的创建、修改与分…

《蓝牙低功耗音频技术架构解析》

《2025GAS声学大讲堂—音频产业创新技术公益讲座》低功耗蓝牙音频系列专题LE Audio & Auracast™专题讲座第1讲将于8月7日周四19点开讲&#xff0c;本次邀请了蓝牙技术联盟 技术与市场经理 鲁公羽 演讲&#xff0c;讲座主题&#xff1a;《蓝牙低功耗音频技术架构解析》。&…

ubuntu apt安装与dpkg安装相互之间的关系

0. 问题解释 在linux系统中&#xff0c;使用neofetch命令可以看到现在系统中使用dpkg, flatpak, snap安装的包的数量&#xff0c;那么使用apt安装的包被统计在什么位置了呢&#xff0c;使用apt的安装流程和使用flatpak的安装流程有什么关系和区别呢?1. apt 安装的包在哪里&…

YooAsset源码阅读-Downloader篇

YooAsset源码阅读-Downloader 继续 YooAsset 的 Downloader &#xff0c;本文将详细介绍如何创建下载器相关代码 CreateResourceDownloaderByAll 关键类 PlayModeImpl.csResourceDownloaderOperation.csDownloaderOperation.csBundleInfo.cs CreateResourceDownloaderByAll 方法…

豆包新模型与 PromptPilot 实操体验测评,AI 辅助创作的新范式探索

摘要&#xff1a;在 AI 技术飞速发展的当下&#xff0c;各类大模型及辅助工具层出不穷&#xff0c;为开发者和创作者带来了全新的体验。2025 年 7 月 30 日厦门站的火山方舟线下 Meetup&#xff0c;为我们提供了近距离接触豆包新模型与 PromptPilot 的机会。本次重点体验了实验…

深入探讨AI在测试领域的三大核心应用:自动化测试框架、智能缺陷检测和A/B测试优化,并通过代码示例、流程图和图表详细解析其实现原理和应用场景。

引言随着人工智能技术的飞速发展&#xff0c;软件测试领域正在经历一场深刻的变革。AI技术不仅提高了测试效率&#xff0c;还增强了测试的准确性和覆盖范围。本文将深入探讨AI在测试领域的三大核心应用&#xff1a;自动化测试框架、智能缺陷检测和A/B测试优化&#xff0c;并通过…

音视频学习笔记

0.vs应用其他库配置1基础 1.1视频基础 音视频录制原理音视频播放原理图像表示rgb图像表示yuvhttps://blog.51cto.com/u_7335580/2059670 https://blog.51cto.com/cto521/1944224 https://blog.csdn.net/mandagod/article/details/78605586?locationNum7&fps1 视频主要概念…

LLM隐藏层状态: outputs.hidden_states 是 MLP Residual 还是 Layer Norm

outputs.hidden_states 是 MLP Residual 还是 Layer Norm outputs.hidden_states 既不是单纯的 MLP Residual,也不是单纯的 Layer Norm,而是每一层所有组件(包括 Layer Norm、注意力、MLP、残差连接等)处理后的最终隐藏状态。具体需结合 Transformer 层的结构理解: 1. T…

XML 用途

XML 用途 引言 XML&#xff08;可扩展标记语言&#xff09;是一种用于存储和传输数据的标记语言。自1998年推出以来&#xff0c;XML因其灵活性和可扩展性&#xff0c;在众多领域得到了广泛应用。本文将详细介绍XML的用途&#xff0c;帮助读者全面了解这一重要技术。 一、数据存…

亚马逊撤离Google购物广告:重构流量生态的战略博弈

战略突变&#xff1a;从渐进收缩到全面退潮的背后逻辑亚马逊在2025年7月突然全面停止Google Shopping广告投放&#xff0c;这场看似 abrupt 的决策实则经历了一年多的战略铺垫&#xff0c;从2024年Q1开始的预算削减&#xff0c;到2025年Q2美国市场支出减半&#xff0c;直至核心…

【QT】常⽤控件详解(三)常用按钮控件PushButton RadioButton CheckButton Tool Button

文章目录前言一、PushButton1.1 QAbstractButton1.2 添加图标的按钮1.3 给按钮添加快捷键1.4 代码⽰例:按钮的重复触发二、 RadioButtion2.1简介2.2 几个槽函数 click,press,release, toggled 的区别2.2 模拟分组点餐三、 CheckBox四、Tool Button&#x1f6a9;总结前言 一、P…