Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何在 Vue TypeScript 项目使用 emits 事件

如何在 Vue TypeScript 项目使用 emits 事件

作者头像
前端达人
发布于 2023-09-11 12:50:38
发布于 2023-09-11 12:50:38
74500
代码可运行
举报
文章被收录于专栏:前端达人前端达人
运行总次数:0
代码可运行

Vue是构建出色的Web应用程序的最灵活、灵活和强大的JavaScript框架之一。Vue中最重要的概念和关键特性之一是能够促进应用程序组件之间的通信。让我们深入探讨一下Vue中的“emits”概念,并了解它们如何以流畅和无缝的方式实现父子组件之间的通信。

Vue中的emits是什么

Vue应用程序架构中的核心概念之一是组件之间的父子关系。父组件经常需要与其子组件进行交互,反之亦然!我们利用这个概念来创建复杂且交互性强的用户界面。虽然props使得数据从父组件流向子组件,但是“emits”使得数据从子组件流向父组件。

基本上,“emits”是Vue中的一个概念,允许子组件与其父组件进行通信。在Vue中使用emits时,您可以向父组件发出带有数据(可选)的自定义事件。父组件可以监听事件并相应地处理自己的“响应”。这是一种强大的机制,可以促进子组件和父组件之间的无缝通信!

为什么 emits 有用

Emits 提供了一种结构化和解耦的方式,使组件能够与其父组件进行交互。这样可以创建更易于维护和扩展的应用程序。通过利用 emits,我们可以创建可重用的子组件,而不会将它们与其父组件紧密耦合在一起,从而可以在各种上下文中使用。

Emits 在实现子组件与父组件之间的高度解耦方面起着至关重要的作用。当子组件向父组件发射事件时,它们不会直接操作父组件的状态或调用父组件的方法。相反,发射器提供了一个抽象层,允许父组件决定如何处理这些事件。我认为,这种关注点的分离有助于实现更易于维护和可扩展的架构!

组件通信

Vue遵循组件化架构,将用户界面划分为更小、自包含的单元,也称为组件。组件可以嵌套和组合,以构建复杂的应用程序。然而,随着组件的嵌套和应用程序的扩大,组件之间的通信变得必不可少!组件通信允许不同的组件交换数据、触发操作,并在整个应用程序中保持应用程序状态的一致性。

让我们来看一个简单的例子,了解一下如何在Vue中让组件进行通信。

子组件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
 <button @click="sendMessageToParent">Send Message to Parent</button>
</template>

<script setup>
import { defineEmits } from 'vue';

const emit = defineEmits(['messageToParent']);

const sendMessageToParent = () => {
const message = 'Hello from child!';
emit('messageToParent', message);
}
</script>

父组件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div>
    <child-component @message-to-parent="handleMessageFromChild" />
    <p>Message from child: {{ messageFromChild }}</p>
  </div>
</template>

<script setup>
import ChildComponent from './ChildComponent.vue';
import { ref } from 'vue';

const messageFromChild = ref('');

const handleMessageFromChild = (message) => {
  messageFromChild.value = message;
}
</script>

在这个例子中,我们有一个 ChildComponent ,当按钮被点击时,它会发出一个名为 messageToParent 的自定义事件,并携带一个消息负载。 ParentComponent 监听发出的事件,并使用接收到的消息更新其状态( messageFromChild )。

当在 ChildComponent 中点击“发送消息给父级”按钮时,将执行 sendMessageToParent 函数,发出带有“Hello from child!”消息作为其有效负载的自定义事件。

ParentComponent 通过模板中的 @messageToParent 属性接收发出的事件,并使用 handleMessageFromChild 函数处理它。然后,消息有效载荷存储在 messageFromChild 引用中,该引用会自动更新模板以显示来自子组件的消息。

简单吧?这展示了你如何在Vue中使组件“相互通信”。你不仅仅局限于发送字符串作为载荷;你甚至可以发送复杂类型,如对象、数组等等。

如何在Typescript中正确地使用类型推断

使用emits的一个“缺点”是,当你发出一个自定义事件时,你不一定知道子组件会发出什么。这种不确定性可能会导致数据类型和运行时错误的潜在问题。幸运的是,Vue 3的Composition APITypeScript结合提供了一个非常强大的解决方案来解决这个问题。通过正确地为emits添加类型,你可以确保类型安全性,提高代码清晰度,并使你的Vue应用程序更易于维护。

让我们探索如何使用Vue 3的Composition API和script setup正确地使用TypeScript来输入emits。

子组件(使用TypeScript):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <button @click="sendDataToParent">Send Data to Parent</button>
</template>

<script setup lang="ts">
import { defineEmits } from 'vue';

// Define the interface for the emitted object 
// (Ideally a shared interface for both components)
// This could event get exported, fot the parent component can import it
interface ItemData {
  id: number;
  name: string;
  quantity: number;
}

const emit = defineEmits<{
  // Define the emitted event and its payload type
  (event: 'dataToParent', payload: ItemData[]): void;
}>();

function sendDataToParent() {
  const payload: ItemData[] = [
    { id: 1, name: 'Item 1', quantity: 3 },
    { id: 2, name: 'Item 2', quantity: 5 },
    { id: 3, name: 'Item 3', quantity: 2 },
  ];

  emit('dataToParent', payload);
}
</script>

父组件:(使用TypeScript)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
  <div>
    <test-child @data-to-parent="handleDataFromChild" />
    <div v-if="itemsFromChild.length">
      <p v-for="item in itemsFromChild" :key="item.id">Item: {{ item.name }} | Quantity: {{ item.quantity }}</p>
    </div>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue';
import TestChild from '@/TestChild.vue';

// Define the interface for the emitted object 
// (Ideally a shared interface for both components)
interface ItemData {
  id: number;
  name: string;
  quantity: number;
}

const itemsFromChild = ref<ItemData[]>([]);

const handleDataFromChild = (payload: ItemData[]) => {
  itemsFromChild.value = payload;
};
</script>

通过利用TypeScript的强大功能,我们可以确保我们的组件之间的通信精确无误且类型安全。使用接口和精确的负载类型定义,我们能够在开发过程中捕获潜在的错误,同时提升代码补全功能,提高应用程序的整体可维护性!

结束

由于文章内容篇幅有限,今天的内容就分享到这里,文章结尾,我想提醒您,文章的创作不易,如果您喜欢我的分享,请别忘了点赞和转发,让更多有需要的人看到。同时,如果您想获取更多前端技术的知识,欢迎关注我,您的支持将是我分享最大的动力。我会持续输出更多内容,敬请期待。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-08-31 08:00,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端达人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
🎉一个demo体验Vue3.3+TypeScript所有新功能🎉
由于最新的功能defineModel是实验特性,需要在vite.config.js里开启,另外需要开启解构props响应式功能
萌萌哒草头将军
2023/06/18
6020
🎉一个demo体验Vue3.3+TypeScript所有新功能🎉
一文掌握Vue3的组件&组件通信
在前端开发中,组件化就是“搭积木”——将页面功能拆分成一个个可复用的“积木块”,然后自由组合,快速搭建出各种炫酷的页面。
方才编程_公众号同名
2024/11/19
2310
一文掌握Vue3的组件&组件通信
聊一聊如何在Vue中使用事件总线( Event Bus)进行组件间通信
跨通信是应用程序中组件之间的交互。这有助于应用程序的不同部分之间的顺畅协作。其重要性体现在以下几个方面:
前端达人
2023/10/21
1.5K0
聊一聊如何在Vue中使用事件总线( Event Bus)进行组件间通信
Vue 3 组件通信方式总结
子组件接收父级自定义属性则与vue2不同,vue2中是以props 配置项来接收,vue3 中则需要 用到宏函数 defineProps类接收
iwhao
2024/07/24
2910
掌握这些容易被忽略的Vue组件细节,提升开发效率,事半功倍!
组件允许我们将 UI 划分为独立的、可重用的部分,并且可以对每个部分进行单独的思考。
奋飛
2023/07/10
5190
掌握这些容易被忽略的Vue组件细节,提升开发效率,事半功倍!
Vue 3 + TypeScript 组件封装艺术:从原理到实践
在现代前端开发中,组件化开发已成为主流模式。Vue 3 配合 TypeScript 的组合,为我们提供了更强大的类型系统和更优秀的开发体验。本文将深入探讨如何基于 Vue 3 和 TypeScript 进行高质量的组件封装,并通过实际案例展示最佳实践。
编程小白狼
2025/04/26
2060
7个 Vue3 中的组件通信方式
本文采用<script setup />的编写方式,比options API更自由。然后我们会讲以下七种组件通信方式:
唐志远
2022/10/27
7520
7个 Vue3 中的组件通信方式
Vue3开发之components组件
开发过程中我们会经常遇到一些复杂的页面,而这些页面大部分由一个个小部分组合起来的,而且不同页面中可能有些部分是一样的,所以我们通常会将这些部分封装成组件。在Vue中,我们可以使用components组件(模板)来实现。
BennuCTech
2023/09/01
2.6K0
Vue3开发之components组件
来吧!一文彻底搞定Vue组件!
组件是什么呢,了解组件对象的分析,Vue组件中的data属性,props传递数据的原理到底是什么。
达达前端
2019/12/16
1K0
来吧!一文彻底搞定Vue组件!
Vue2到Vue3,重学这5个常用的API
距离Vue3发布已经过去一年多时间了,从Vue2到Vue3是一个不小的升级,包括周边生态等。
玄姐谈AGI
2023/01/10
9120
Vue2到Vue3,重学这5个常用的API
Vue3 过10种组件通讯方式
众所周知,Vue.js 中一个很重要的知识点是组件通信,不管是业务类的开发还是组件库开发,都有各自的通讯方法。
德育处主任
2022/04/17
2K0
Vue3 过10种组件通讯方式
Vue3从入门到精通(二)
在Vue3中,侦听器的使用方式与Vue2相同,可以使用watch选项或$watch方法来创建侦听器。不同之处在于,Vue3中取消了immediate选项,同时提供了新的选项和API。
明志德道
2023/10/21
4760
Vue 组件间通信的几种方式
Vue 遵循单向数据流的原则,状态会从父组件传递给子组件,避免子组件意外改变父组件状态导致的混乱逻辑。
前端西瓜哥
2022/12/21
2K0
前端系列14集-Vue3-setup
页面浏览量(Page View,PV)和访客数(Unique Visitors,UV)
达达前端
2023/10/08
5160
前端系列14集-Vue3-setup
vue3.0 sfc 中 setup 的变化
在vue中,sfc(单文件组件)指的是文件后缀名为.vue的特殊文件格式,它允许将 Vue 组件中的模板、逻辑 与 样式封装在单个文件中。
玖柒的小窝
2021/10/05
5650
Vue组件通信探究之子组件向父组件传递数据
在Vue.js应用中,组件通信是一个不可忽视的话题。除了父组件向子组件传递数据外,还存在一种常见的场景:子组件向父组件传递数据。本文将详细介绍Vue中子组件向父组件传递数据的实现方式,并通过实际例子演示这一过程。
用户10781437
2023/10/10
3350
Vue3学习笔记(四)——组件、生命周期
如果我们将一个页面中所有的处理逻辑全部放在一起,处理起来就会变得非常复杂,而且不利于后续的管理以及扩展,但如果,我们将一个页面拆分成一个个小的功能块,每个功能块完成属于自己这部分独立的功能,那么之后整个页面的管理和维护就变得非常容易了。如果我们将一个个功能块拆分后,就可以像搭建积木一下来搭建我们的项目。
张果
2022/11/14
1.5K0
Vue3学习笔记(四)——组件、生命周期
总结vue3中常用的组件间通信的方法
这也是面试经常问到的一道题,正好近期刷到这道题, 然后就写写小demo,顺便将父子组件通信,兄弟组件通信, 跨组件通信, 总结复习一下.
心安事随
2024/07/29
1660
总结vue3中常用的组件间通信的方法
Vue3中的事件处理:事件绑定、事件修饰符、自定义事件
在前端开发中,事件处理是一项重要的技术,它允许我们对用户的交互做出响应,并提供更好的用户体验。Vue3作为一款流行的JavaScript框架,提供了强大而灵活的事件处理机制。本文将详细介绍Vue3中的事件处理,包括事件绑定、事件修饰符、自定义事件等方面。
网络技术联盟站
2023/07/05
5.2K0
vue 组件自定义事件
自定义事件是一种允许组件之间进行事件传递和监听的机制。通过在组件中定义和触发自定义事件,我们可以实现组件之间的通信。组件可以发出自定义事件,其他组件可以监听这些事件并做出响应。
堕落飞鸟
2023/05/21
6870
相关推荐
🎉一个demo体验Vue3.3+TypeScript所有新功能🎉
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验