Vue.js中使用emits完成数据子传父的组件事件

devtools/2025/1/15 23:46:53/

作者:CSDN-PleaSure乐事

欢迎大家阅读我的博客 希望大家喜欢

使用环境:WebStorm edge浏览器

目录

1.组件事件介绍

2.组件事件工作原理

2.1发射事件 (Emitting Events)

2.2监听事件 (Listening for Events)

2.3声明事件 (Declaring Events)

例子

App.vue

FatherComponent.vue

ChildComponent.vue

注意点

报错解决​​​​​​​​​​​​​​


1.组件事件介绍

在组件的模版表达式中,可以直接使用$emit方法触发自定义事件,触发自定义事件的目的是组件之间传递数据。

组件事件是一种允许父组件监听子组件中发生的特定行为或状态变化的机制。它们是父子组件之间通信的一种方式,使得数据可以由子组件流向父组件。这与属性(props)的数据流方向相反,属性是从父组

2.组件事件工作原理

2.1发射事件 (Emitting Events)

子组件通过调用 this.$emit(eventName, [payload]) 来发射一个自定义事件。eventName 是你给事件起的名字,[payload] 是可选的参数,它代表了你想要传递给父组件的数据。

2.2监听事件 (Listening for Events)

父组件可以在模板中使用 v-on 指令来监听子组件发射的事件,并且可以选择性地提供一个处理函数来响应这些事件。

2.3声明事件 (Declaring Events)

在 Vue 3 中,推荐在子组件内显式声明所有可能发射的事件。这是通过 emits 选项完成的。这样做不仅有助于代码的可读性和维护性,还可以启用自动化的类型检查和编译时验证。

例子

下面的代码是组件事件(子传父)的举例,经过博主的测试,可以正常运行:

App.vue

<template>
<FatherComponent></FatherComponent>
</template>
<script>
import FatherComponent from "@/components/FatherComponent.vue";export default {components: {FatherComponent},data(){return{}}}
</script>

FatherComponent.vue

<template><h3>Hello World+FatherComponent</h3><childComponent @anotherEvent="Pleasure"></childComponent><h3>接收到的数据是:{{ messageFather }}</h3>
</template>
<script>
import childComponent from "@/components/ChildComponent.vue";export default {components: {childComponent},data() {return {messageFather: ""}},methods: {Pleasure(data) {this.messageFather = data}}
}
</script>

ChildComponent.vue

<template><h3>Vue3.0+ChildComponent</h3><button @click="eventHandlerChild">点我练习两年半</button>
</template>
<script>
export default {//要加上emits声明可以触发的事件emits:['anotherEvent'],data(){return{msg:"ChildData"}},methods:{eventHandlerChild(){this.$emit("anotherEvent",this.msg)}}
}
</script>

最终效果如下:

注意点

在需要子传父的代码中,最好加上emits声明可以触发的事件,否则浏览器可能会有警告。

另外,需要注意,红色和蓝色部分的函数名要保持一致,黄色部分传递的是同一个东西。

另外,为了确保跨浏览器兼容性,建议使用小写字母为事件命名,即使 HTML 对大小写不敏感。

同时非原生 DOM 事件也需要注意,组件事件不同于原生 DOM 事件,如 click 或 input。如果希望在组件中使用原生事件,你可以使用 .native 修饰符(Vue 2),但在 Vue 3 中,.native 修饰符已被移除,因为默认情况下所有事件都是组件事件。

事件修饰符也应当注意,类似于原生事件,也可以对组件事件使用事件修饰符,例如 .once.capture 等等。

报错解决

[Warning] [Vue warn]: Extraneous non-emits event listeners (anotherEvent) were passed to component but could not be automatically inherited because component renders fragment or text root nodes. If the listener is intended to be a component custom event listener only, declare it using the "emits" option. (​

如果遇到像上面这样的报错,表示在组件中传递了一些额外的非 emits 事件监听器,这些监听器不能自动继承给子组件,因为该子组件渲染的是片段或文本根节点。

在 Vue 3 中,如果有一个自定义组件,并且你希望父组件能够监听子组件触发的特定事件,需要明确地声明这些事件。这通过在子组件中使用 emits 选项来完成。如果一个事件没有被声明为 emits 的一部分,Vue 将会发出警告,因为它无法确定这个事件是否应该被作为自定义事件来监听。

如下属代码中加入「 emits:['anotherEvent'] 」:

export default {//要加上emits声明可以触发的事件emits:['anotherEvent'],data(){return{msg:"ChildData"}},methods:{eventHandlerChild(){this.$emit("anotherEvent",this.msg)}}
}
</script>

作者:CSDN-PleaSure乐事

希望我的博客对您有帮助,也希望在对您有帮助时您可以为我留下点赞收藏与关注,这对我真的很重要,谢谢!


http://www.ppmy.cn/devtools/150435.html

相关文章

QCC3040主端音频蓝牙模块在跑步机(健身车)中的应用

在跑步机或者健身车中应用主端音频蓝牙模组的方案主要涉及到音频传输和无线控制&#xff0c;提供一个无缝、无线的运动体验。 一、音频传输 主端音频蓝牙模组ANS-BT302DM使用QCC3040方案&#xff0c;可以用于无线音频传输&#xff0c;允许用户在跑步机或健身车上享受音乐、视…

蓝耘:GPU算力云服务的技术探索与AIGC应用支持

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 一、蓝耘的核心优势 1. 行业领先的基础设施 …

4.5 在C++节点中使用参数

本节沿用之前4.3 节小海龟控制例子。 4.5.1 参数声明与设置 打开src/demo_cpp_service/src/turtle_control.cpp文件 添加测试代码 this->declare_parameter("k",1.0);this->declare_parameter("max_speed",1.0);this->get_parameter("k&q…

成功案例分享 — 芯科科技助力涂鸦智能打造Matter over Thread模块,简化Matter设备开发

芯科科技&#xff08;Silicon Labs&#xff09;的愿景之一是让开发者每天都能够更轻松地开发无线物联网&#xff08;IoT&#xff09;。特别是在拥有相同愿景的合作伙伴的帮助下&#xff0c;我们每天都在取得进步。但是要想弥合知识水平和物联网开发之间的差距仍会面临一定的挑战…

并发设计模式 - 优雅终止线程

1、优雅终止线程的设计模式 思考&#xff1a;在一个线程 T1 中如何优雅的终止线程 T2&#xff1f; 正确思路&#xff1a;两阶段终止模式 1.1 两阶段终止&#xff08;Two-phase Termination&#xff09;模式——优雅的终止线程 两阶段终止&#xff08;Two-phase Termination…

Unocss 中 !important 的使用及相关特性解析

​ 引言 在前端开发中&#xff0c;样式冲突是经常会遇到的问题。Unocss 作为一款强大的原子化 CSS 框架&#xff0c;提供了许多便捷的方式来处理样式&#xff0c;其中 !important 的使用有着独特的规则和场景。本文将深入探讨这些内容&#xff0c;并介绍一些其他有用的 Unocss …

Blazor中Syncfusion Word组件使用方法

Blazor中Syncfusion Word组件用于在Blazor应用程序中创建、编辑、查看和打印 Word&#xff08;DOC、DOCX 和 RTF&#xff09;文档。 主要功能&#xff1a; 从头开始创建文档。打开和编辑 Word&#xff08;DOC、DOCX&#xff09;、RTF 和 SFDT&#xff08;Syncfusion 文档文本…

计算机网络 | 什么是公网、私网、NAT?

关注&#xff1a;CodingTechWork 引言 计算机网络是现代信息社会的基石&#xff0c;而网络通信的顺畅性和安全性依赖于有效的IP地址管理和网络转换机制。在网络中&#xff0c;IP地址起到了标识设备和进行数据传输的核心作用。本文将详细讨论公网IP、私网IP以及NAT转换等网络技…