前往小程序,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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ConstraintLayout 使用详解,减少嵌套 UI, 提升性能
对于初学者来说,可能觉得ConstraintLayout属性多,且属性长而弃用它,那你错失了这个大宝贝。
程序员徐公
2023/03/08
1.8K0
ConstraintLayout 使用详解,减少嵌套 UI, 提升性能
笔记74 | 学习掌握ConstraintLayout的基本属性
最近一个礼拜业余时间都在搞我的淘宝店铺,有兴趣的都可搜一下:吉安车品,主营汽车脚垫/后备箱垫/座垫,还在打基础阶段,不急,慢慢搞,当业余爱好去买卖;当然吃饭手艺功夫自然也不能丢,为下个月的变数准备,今天开始复习/学习一些基础内容,今天的笔记是ConstraintLayout的几个属性。 1、Circular positioning(圆形定位) 标题后面的中文是自己翻译的,可能不是很准确。 官方文档是这么介绍的: You can constrain a widget center relative to an
项勇
2018/06/19
1.3K0
ConstraintLayout(约束布局)的使用
这些属性会引用另一个控件的id或者parent(这会引用父容器,即ConstraintLayout)
用户1205080
2018/10/18
2.4K0
ConstraintLayout(约束布局)的使用
ConstraintLayout 入门指南
本文主要介绍了ConstraintLayout从诞生到如今在Android App开发中的重要性、使用场景、优缺点,以及社区的发展状况。通过实际案例和设计模式,展示了ConstraintLayout在移动开发领域的魅力,并针对实际开发中遇到的问题提供了一些解决方案。
QQ音乐技术团队
2017/09/19
2.6K0
ConstraintLayout 入门指南
项目需求讨论 — ConstraintLayout 详细使用教程
关于ConstraintLayout的文章网上一抓一大把,而且ConstraintLayout在16年就已经出来了,但是我一直没有试着去使用(别问我为什么不去使用,当然是因为懒啊)。毕竟前面的LinearLayout搭配RelativeLayout用习惯了,但是毕竟能减少布局的嵌套。还是要抱着多学习的方式去接触。所以写下文章作为总结。
青蛙要fly
2018/08/29
1.8K0
项目需求讨论 — ConstraintLayout 详细使用教程
Android ConstraintLayout布局详解[通俗易懂]
之前在使用Android Studio新建项目的时候,发现MainActivity的默认布局从RelativeLayout变成了ConstraintLayout。当时就对这个ConstraintLayout很好奇,就研究了一下。发觉确实很强大,在此做个总结。
全栈程序员站长
2022/08/22
1.8K0
Android ConstraintLayout布局详解[通俗易懂]
再学一次ConstraintLayout 一些新特性
首先,ConstraintLayout是一个新的布局,它是直接继承自ViewGroup的,所以在兼容性方面是非常好的.官方称可以兼容到API 9.可以放心食用.
Android技术干货分享
2019/03/28
1.8K0
再学一次ConstraintLayout 一些新特性
ConstraintLayout使用汇总
在这里我要向大家介绍ConstraintLayout,它是一种布局方法,可以帮助我们在对Android进行布局时减少对布局层次的嵌套,进而提高app的性能。
Rouse
2019/07/16
8690
【约束布局】ConstraintLayout 屏幕适配案例 ( 使用代码生成约束布局控件属性 )
文章目录 一、ConstraintLayout 屏幕适配案例 二、使用代码生成约束布局 一、ConstraintLayout 屏幕适配案例 ---- ConstraintLayout 屏幕适配案例 :
韩曙亮
2023/03/30
4960
【约束布局】ConstraintLayout 屏幕适配案例 ( 使用代码生成约束布局控件属性 )
ConstraintLayout约束控件详解
简介 在Google IO大会中不仅仅带来了Android Studio 2.2预览版,同时带给我们一个依赖约束控件–ConstraintLayout。一种构建于弹性Constraints(约束)系统
xiangzhihong
2018/02/06
1.3K0
ConstraintLayout约束控件详解
细细品读!深入浅出,官方文档看ConstraintLayout
之前品读了郭霖大神写的《Android新特性介绍,ConstraintLayout完全解析》,受其感染,写了一篇《未来布局之星——ConstraintLayout》,回过头来看,感觉这一篇文章太注重可视化操作,于是去翻阅了一下ConstraintLayout的官方文档,决定从官方文档的角度在代码层面来了解一下ConstraintLayout。
代码咖啡
2018/08/28
1K0
细细品读!深入浅出,官方文档看ConstraintLayout
Android ConstraintLayout百分比布局使用详解
Android ConstraintLayout是谷歌推出替代PrecentLayout的组件。支持相对布局、线性布局、帧布局,笔者看来更像是FrameLayout 、LinearLayout、RelativeLayout三者的结合体,并且比这三者更强大的是实现了百分比布局,大家都知道安卓碎片严重,使用百分比适配,那么将彻底解决适配问题。
全栈程序员站长
2022/08/30
6.3K0
Android ConstraintLayout百分比布局使用详解
1.android布局-ConstraintLayout-约束布局
ConstraintLayout 是什么? ConstraintLayout ConstraintLayout 怎么用? 基本用法 layout_constraint[当前控件位置]_[目标控件位置]="[目标控件ID]" 1.上下排列 a b b: app:layout_constraintTop_toBottomOf="a" 实例: <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.an
tea9
2022/07/16
5650
1.android布局-ConstraintLayout-约束布局
【约束布局】ConstraintLayout 约束布局 ( 简介 | 引入依赖 | 基本操作 | 垂直定位约束 | 角度定位约束 | 基线约束 )
文章目录 一. ConstraintLayout 简介 1. 引入 约束 布局 ( 1 ) 约束性布局 作用 和 简介 2. 约束 简介 ( 1 ) 约束个数要求 ( 2 ) 约束设置 与 显示位置 3. ConstraintLayout 引入 ( 1 ) ConstraintLayout 依赖添加 ( 2 ) ConstraintLayout 转换 与 添加 二. ConstraintLayout 约束 的 基本操作 1. 约束基本操作 ( 1 ) Design ( 设计 ) 和 Bluepr
韩曙亮
2023/03/27
6.6K0
【约束布局】ConstraintLayout 约束布局 ( 简介 | 引入依赖 | 基本操作 | 垂直定位约束 | 角度定位约束 | 基线约束 )
【约束布局】ConstraintSet 约束集 ( 简介 | 约束属性集合 | 约束集初始化 | 约束集应用到布局中 | 关键帧动画 | TransitionManager 使用 )
① ConstraintSet 约束集 概念 : ConstraintSet 约束集 顾名思义 , 就是 约束属性的集合 , 其表示 约束布局 ( ConstraintLayout ) 中 所有的组件 的 约束条件 , 尺寸 , 边距 , 等 约束属性 ;
韩曙亮
2023/03/27
3.4K0
【约束布局】ConstraintSet 约束集 ( 简介 | 约束属性集合 | 约束集初始化 | 约束集应用到布局中 | 关键帧动画 | TransitionManager 使用 )
Constraintlayout约束布局三问
Constraintlayout——约束布局,作为Jetpack的一个组件推出。今天的面试三问就是关于布局的:
码上积木
2020/09/27
1.7K0
ConstraintLayout 使用简介一 背景二 demo三 进一步升级打怪四 更多
一 背景 ConstraintLayout 是目前是android studio 2.2 以后的默认根布局。 到目前为止,大家还是习惯常用的布局。同事先尝试了下ConstraintLayout优化布局
用户1127566
2018/06/06
2.5K0
ConstraintLayout概要
约束布局ConstraintLayout 是一个ViewGroup,可以在Api9以上的Android系统使用它,它的出现主要是为了解决布局嵌套过多的问题,以灵活的方式定位和调整小部件。
码客说
2020/07/03
9630
一文看懂ConstraintLayout的用法
ConstraintLayout 相对于 RelativeLayout来说性能更好,布局上也更加灵活。在最新的Google Android开发文档中是推荐使用 ConstraintLayout的,下面来看看具体用法。
阳仔
2019/07/30
8180
一文看懂ConstraintLayout的用法
【约束布局】ConstraintLayout 偏移 ( Bias ) 计算方式详解 ( 缝隙比例 | 计算公式 | 图解 | 测量图 + 公式 )
水平偏移 ( app:layout_constraintHorizontal_bias ) :
韩曙亮
2023/03/27
2.3K0
【约束布局】ConstraintLayout 偏移 ( Bias ) 计算方式详解 ( 缝隙比例 | 计算公式 | 图解 | 测量图 + 公式 )
推荐阅读
相关推荐
ConstraintLayout 使用详解,减少嵌套 UI, 提升性能
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验