Vue3小知识:一篇关于emits的使用指南
ztj100 2025-01-05 01:02 19 浏览 0 评论
转载说明:原创不易,未经授权,谢绝任何形式的转载
Vue是构建出色的Web应用程序的最灵活、灵活和强大的JavaScript框架之一。Vue中最重要的概念和关键特性之一是能够促进应用程序组件之间的通信。让我们深入探讨一下Vue中的“emits”概念,并了解它们如何以流畅和无缝的方式实现父子组件之间的通信。
Vue中的emits是什么
Vue应用程序架构中的核心概念之一是组件之间的父子关系。父组件经常需要与其子组件进行交互,反之亦然!我们利用这个概念来创建复杂且交互性强的用户界面。虽然props使得数据从父组件流向子组件,但是“emits”使得数据从子组件流向父组件。
基本上,“emits”是Vue中的一个概念,允许子组件与其父组件进行通信。在Vue中使用emits时,您可以向父组件发出带有数据(可选)的自定义事件。父组件可以监听事件并相应地处理自己的“响应”。这是一种强大的机制,可以促进子组件和父组件之间的无缝通信!
为什么 emits 有用
Emits 提供了一种结构化和解耦的方式,使组件能够与其父组件进行交互。这样可以创建更易于维护和扩展的应用程序。通过利用 emits,我们可以创建可重用的子组件,而不会将它们与其父组件紧密耦合在一起,从而可以在各种上下文中使用。
Emits 在实现子组件与父组件之间的高度解耦方面起着至关重要的作用。当子组件向父组件发射事件时,它们不会直接操作父组件的状态或调用父组件的方法。相反,发射器提供了一个抽象层,允许父组件决定如何处理这些事件。我认为,这种关注点的分离有助于实现更易于维护和可扩展的架构!
组件通信
Vue遵循组件化架构,将用户界面划分为更小、自包含的单元,也称为组件。组件可以嵌套和组合,以构建复杂的应用程序。然而,随着组件的嵌套和应用程序的扩大,组件之间的通信变得必不可少!组件通信允许不同的组件交换数据、触发操作,并在整个应用程序中保持应用程序状态的一致性。
让我们来看一个简单的例子,了解一下如何在Vue中让组件进行通信。
子组件
<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>
父组件
<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 API与TypeScript结合提供了一个非常强大的解决方案来解决这个问题。通过正确地为emits添加类型,你可以确保类型安全性,提高代码清晰度,并使你的Vue应用程序更易于维护。
让我们探索如何使用Vue 3的Composition API和script setup正确地使用TypeScript来输入emits。
子组件(使用TypeScript):
<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)
<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的强大功能,我们可以确保我们的组件之间的通信精确无误且类型安全。使用接口和精确的负载类型定义,我们能够在开发过程中捕获潜在的错误,同时提升代码补全功能,提高应用程序的整体可维护性!
由于文章内容篇幅有限,今天的内容就分享到这里,文章结尾,我想提醒您,文章的创作不易,如果您喜欢我的分享,请别忘了点赞和转发,让更多有需要的人看到。同时,如果您想获取更多前端技术的知识,欢迎关注我,您的支持将是我分享最大的动力。我会持续输出更多内容,敬请期待。
相关推荐
- 3道常见的vue面试题,你都会了吗?
-
最近流传各大厂纷纷裁员,导致很多人“被迫”毕业,显然很多人还是想留级,无奈出现在名单中,只能感叹命运不公,不过拿了N+1,也算是很欣慰。...
- VuePress 中如何增加用户登录功能
-
VuePress是什么?先让我们看看VuePress能干什么?有什么效果?很像vue官网的文档页面,因为vuePress就是尤大大的一个力作...
- 模拟 Vue 中 JS 动态表达式在模版中被动态解析的实现
-
最近在写自己的一个web框架ref-lit.js,仅仅打算自己练练手,在这个框架中,其模版语法借助了...
- Vue3 require is not defined(is not defined翻译)
-
vue2中想动态引入资源,而且涉及到ifelse的判断条件的,类似于vue/index.js中的if(process.env.NODE_ENV==='production'...
- 个人总结-CAD个人经验积累(cad总结报告)
-
CAD个人经验积累1、创建块时,块的所有元素都放的0图层,创建好的块放在要使用的图层(layer1),如果0图层是的元素颜色等使用随层时,那么这些元素的性质会随着创建好的块放在要使用的图层layer1...
- 胃癌也跟HER2基因有关?让欧洲专家跟你说道说道?
-
编译:Dr.Peng来源:肿瘤资讯有效的HER2检测对于HER2阳性胃癌患者的一线化疗方案的选择至关重要。尽管乳腺癌HER2是常规检测指标,但是对于胃癌,仅仅是在临床医生要求时进行检测。多学科德国专家...
- CAD快捷键命令大全汇总,建议收藏保存
-
CAD在我们打工人心目中,简直绝了。但是日常工作中,总觉得有点不得劲的地方,所以熟悉掌握和运用快捷键是我们提高绘图速度的法宝之一,下面了解下快捷键都有哪些!...
- 超简 Vue3+Ts 可视化拖拽设计器DreamDesign
-
今天给大家分享一款vue3.x在线表单可视化布局设计模板DreamDesign。dream-design基于vue3+vite+ts的可视化页面设计器,可在线设计页面表单等,支持引入多种组件...
- 《若依ruoyi》第十五章:Ruoyi 详解VUE常用的几种import引入方式
-
1、什么是组件都说Vue是组件化开发,确实有道理,别说按钮输入框这种组件了,就连每个页面,从本质来看也是一个个组件,所以目标很明确,拿来就能用,有一定使用规范和预设样式,我都认为是一个组件,包括有一定...
- 《若依ruoyi》第三十七章:Ruoyi利用poi-ooxml导出execl功能拆解
-
本章节重点介绍每个列表按钮栏都有一个导出功能,今天分析一下这个导出的实现逻辑1、界面操作第一步:点击右侧菜单栏的角色管理,系统展示角色列表,找到顶部的导出按钮,然后点击。第二步:系统自动下载并保存本地...
- 来实现一个右键菜单吧(添加右键菜单项)
-
由于公司项目的需要,需要在目前视图库上加一个右键菜单,我开始觉得这还挺好搞得,因为我在这个项目得其他地方看到过类似的东西,我开始以为是一个组件来着,后面找到对应的页面一看,得,不是组件,本来想直接复制...
- 《若依ruoyi》第三十九章:若依-数据字典的使用详解
-
字典管理是用来维护数据类型的数据,如下拉框、单选按钮、复选框、树选择的数据,方便系统管理员维护。主要功能包括:字典分类管理、字典数据管理.本文通过实际使用案例来简单的记录一下ruoyivue字典的...
- 《若依ruoyi》第三十一章:Ruoyi用户管理功能代码逻辑拆解四
-
继续上一篇文章进行功能代码拆解1、岗位和角色下拉框实现<el-col:span="12"><el-form-itemlabel="岗位"&g...
- 国内大厂AI插件评测:根据UI图生成Vue前端代码
-
在IDEA中安装大厂的AI插件,打开ruoyi增强项目:yudao-ui-admin-vue31.CodeBuddy插件...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)