Vue 3 的 emit 简单使用

news2024/11/28 1:35:20

在 Vue 3 中使用 emit,子组件可以将事件通知父组件,父组件可以在响应这些事件时执行特定的逻辑。

emit 是一种非常灵活的通信方式,允许组件之间以解耦的方式进行交互。

1. 基本用法

1、使用 defineEmits

子组件

<template>
  <div style="border: 1px solid orange">
    <p>Child</p>
    <button @click="handleClick" style="border: none;">Click Me</button>
  </div>
</template>

<script setup>
import { defineEmits } from 'vue'
const emit = defineEmits(['update']) // 定义事件
const handleClick = () => {
  emit('update', 'newValue') // 触发 'update' 事件,并传递参数
}
</script>

父组件

<template>
  <div style="border: 1px solid red">
    <p>Father</p>
    <Child @update="handleUpdate" />
  </div>
</template>

<script setup>
import Child from './Child.vue'

const handleUpdate = (value) => {
  console.log('Received from child:', value)
}
</script>

2、在模板中直接使用 emit 

子组件

<template>
  <div style="border: 1px solid orange">
    <p>Child</p>
    <button @click="$emit('update', 'newValue')" style="border: none;">Click Me</button>
  </div>
</template>

父组件不变 

3、在 JSX/TSX 中使用 emit 

子组件

import { defineComponent } from 'vue';

export default defineComponent({
  setup(_, { emit }) {
    const handleClick = () => {
      emit('update', 'newValue');
    };

    return () => (
      <div style="border: 1px solid orange">
        <p>Child</p>
        <button style="border: none;" onClick={handleClick}>Click Me</button>
      </div>
    );
  }
});

父组件

import { defineComponent } from 'vue';
import Child from './Child';

const Father = defineComponent({
  setup() {
    const handleUpdate = (value) => {
      console.log('Received from child:', value)
    }
    return () => (
      <div style="border: 1px solid red">
        <p>Father</p>
        <Child onUpdate={handleUpdate} />
      </div>
    );
  },
});

export default Father;

2. 举例 🌰

子组件

import { defineComponent } from 'vue';

const Child = defineComponent({
  props: ['label', 'message'],
  emits: {
    'update': (value: string) => typeof value === 'string',
    'click': null,
  },
  setup(props, { emit }) {
    const emitEvent = () => {
      emit('update', 'Hello from Child!');
      emit('click');
    };
    return () =>
      <div style={{ border: '1px solid pink' }}>
        <h3>Child Component Content</h3>
        <button onClick={emitEvent} style={{ border: 'none' }}>{props.label}</button>
        <div>props.message:{props.message}</div>
      </div>
  },
});

export default Child;

父组件

import { defineComponent, ref } from 'vue';
import Child from './Child';

const Father = defineComponent({
  setup() {
    const date = ref('2024-08-21');
    const handleUpdate = (target: string) => {
      console.log('Update event received:', target);
    };
    const handleClick = () => {
      console.log('Click event received');
    };
    return () => (
      <div>
        <Child label="Click Me" message={date.value} onUpdate={handleUpdate} onClick={handleClick} />
      </div>
    );
  },
});

export default Father;

父组件向子组件传递数据,子组件使用 prop 接收,进而展示到页面。

子组件向父组件抛出事件 emit,并且可以传递参数,父组件使用 onXXX 来监听子组件触发的事件。比如 onUpdate 和 onClick 事件。

3. 注意事项

1、事件名称区分大小写

Vue 3 中的事件名称是区分大小写的。这意味着 @update 和 @Update 是两个不同的事件名称。在子组件和父组件中,确保事件名称的一致性非常重要。

2、事件参数传递

使用 emit 可以传递多个参数,这些参数将在父组件中对应的事件处理函数中接收到,并且需要按照顺序正确接收它们。

// 子组件
emit('update', 'value1', 'value2');

// 父组件
<Child @update="handleUpdate" />

<script setup>
const handleUpdate = (param1, param2) => {
  console.log(param1, param2); // param1 = 'value1', param2 = 'value2'
};
</script>

3、事件参数类型

在使用 TypeScript 时,defineEmits 可以定义事件和参数的类型。不仅可以提高代码的安全性,还能在开发过程中获得更好的类型提示。

const emit = defineEmits<{ (event: 'update', value: string): void }>();

emit('update', 'newValue'); // 正确
emit('update', 123); // 错误,类型不匹配

4、确保事件已声明

通过 defineEmits 定义子组件中的事件时,要确保所有可能触发的事件都已声明。未声明的事件将无法通过 emit 触发。

const emit = defineEmits(['update', 'delete']);

emit('update', 'newValue'); // 正确
emit('delete'); // 正确
emit('add'); // 错误,未声明 'add' 事件

5、避免滥用事件

在设计组件时,尽量减少事件的种类和数量,尤其是在组件树较为复杂时。过多的事件可能导致代码难以维护和调试。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Hadoop】知识点总结、大学期末复习

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; Yaoyao2024往期回顾&#xff1a; 【论文精读】上交大、上海人工智能实验室等提出基于配准的少样本异常检测框架超详细解读&#xff08;翻译&#xff0b;精读&#xff09;每日一…

关于Hipe并发库中动态线程库DynamicThreadPond的一点解读(四)

文章目录 前提提交的任务有返回值怎么办总结 前提 上一节关于Hipe并发库中动态线程库DynamicThreadPond的一点解读(三)我们分析了以何种方式向线程池提交任务、提交的任务若有参数怎么办&#xff0c;这一节我们分析提交的任务若有返回值怎么办&#xff1f; 提交的任务有返回值…

bootloader相关内容的辨析

在PC机中&#xff0c;BIOS&#xff08;Basic Input/Output System&#xff0c;基本输入输出系统&#xff09;和UEFI&#xff08;Unified Extensible Firmware Interface&#xff0c;统一可扩展固件接口&#xff09;是两种用于初始化系统硬件、加载操作系统启动程&#xff08;如…

nestjs nest-cli.json中的assets不生效

官方文档 Documentation | NestJS - A progressive Node.js framework // nest-cli.json{"collection": "nestjs/schematics","sourceRoot": "src","compilerOptions": {"assets": ["microservices/mail/te…

【宠粉赠书】智能计算系统:从深度学习到大模型 第2版

为了回馈粉丝们的厚爱&#xff0c;今天小智给大家送上一套关于图神经网络的学习宝典——《智能计算系统&#xff1a;从深度学习到大模型 第2版》。下面我会详细给大家介绍这本书&#xff0c;文末留有领取方式。 “只要你想把大模型做得更好、做得更大、做得更快、做得更省电&am…

Docker部署常用开发组件(保姆级教程)

说明 本文总结了一些常用组件的Docker启动命令及过程&#xff0c;在开发过程中只需花费数分钟下载和配置即可完美使用这些服务。 Mysql MySQL 是一种开源关系数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;目前由 Oracle 公司维护。MySQL 以其高性能、可靠性和易用…

Qt4代码实现下面的界面

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

AI预测体彩排3采取888=3策略+和值012路或胆码测试8月22日升级新模型预测第59弹

经过近60期的测试&#xff0c;当然有很多彩友也一直在观察我每天发的预测结果&#xff0c;得到了一个非常有价值的信息&#xff0c;那就是9码定位的命中率非常高&#xff0c;已到达90%的命中率&#xff0c;这给喜欢打私菜的朋友提供了极高价值的预测结果~当然了&#xff0c;大部…

【C++】map、set基本用法

欢迎来到我的Blog&#xff0c;点击关注哦&#x1f495; 前言: C的STL已经学习很大一部分了&#xff0c;接下来介绍的是map set是c的是两种关联容器。 简单介绍 map set&#xff1a; 两者都使用红黑树作为底层数据结构来存储元素。map是一种键值对容器&#xff0c;其中每个键…

pip package查询网站(性质类似于npmjs.com)

网址&#xff1a;PyPI The Python Package Index python 的依赖包查询网站 就和 node 的 npmjs.com 一样

SD-WAN采用哪种网络技术?如何自建SD-WAN组网?

SD-WAN&#xff08;Software-Defined Wide Area Network&#xff0c;软件定义广域网&#xff09;是一种基于软件的网络架构&#xff0c;它利用软件定义网络&#xff08;SDN&#xff09;的技术来管理广域网&#xff08;WAN&#xff09;的连接和服务。SD-WAN的主要目的是提高网络…

四大LLM模型,预训练和后训练新范式详解

导读 最初&#xff0c;大语言模型LLM的训练过程只关注于预训练&#xff0c;但如今已经扩展到包含预训练和后训练两个阶段。后训练通常包括监督指令微调和对齐&#xff0c;这一方法在ChatGPT发布后广泛流行&#xff01; 翻译自:https://magazine.sebastianraschka.com/p/new-l…

基于距离度量学习的异常检测:一种通过相关距离度量的异常检测方法

异常通常被定义为数据集中与大多数其他项目非常不同的项目。或者说任何与所有其他记录(或几乎所有其他记录)显著不同的记录,并且与其他记录的差异程度超出正常范围,都可以合理地被认为是异常。 例如上图显示的数据集中,我们有四个簇(A、B、C和D)和三个位于这些簇之外的点:P1、P…

领夹麦克风哪个牌子的好,2024年无线领夹麦克风十大品牌推荐

在追求高质量音频的时代&#xff0c;一款性能稳定、音质出色的无线领夹麦克风&#xff0c;不仅能够提升内容创作的品质&#xff0c;也是赠予播客爱好者、视频博主的佳礼。然而&#xff0c;市场上的无线领夹麦克风品种繁多&#xff0c;其中不乏一些厂商为追求低成本&#xff0c;…

微软Phi-3.5系列亮相:性能超越Gemini 1.5和GPT-4o

前沿科技速递&#x1f680; 在人工智能领域&#xff0c;微软从未停止过创新的步伐。尽管与OpenAI的合作为微软带来了显著的成功&#xff0c;但他们显然不满足于此。近日&#xff0c;微软再次在AI领域引发关注&#xff0c;正式发布了三款全新的Phi-3.5系列AI模型。这些模型不仅在…

构建基于LLM的应用程序——使用LLM的搜索和推荐引擎

在上一章中&#xff0c;我们介绍了构建对话应用程序的核心步骤。我们从一个基础的聊天机器人开始&#xff0c;然后逐步添加了更复杂的组件&#xff0c;例如记忆、非参数化知识和外部工具。借助LangChain的预构建组件以及Streamlit的UI渲染&#xff0c;这一切都变得相对简单。尽…

C++ TinyWebServer项目总结(6. 高级 I/O 函数)

文件描述符 文件描述符&#xff08;File Descriptor, FD&#xff09;是操作系统中用于访问文件的一个抽象概念。它是一个非负整数&#xff0c;通常由操作系统分配&#xff0c;用来标识被打开的文件或输入输出资源&#xff08;如管道、网络连接等&#xff09;。文件描述符在操作…

苍穹外卖之员工管理、分类管理

新增员工 新增员工 需求分析和设计 产品原型&#xff1a; 接口设计&#xff1a; 数据库设计&#xff1a; 代码开发 根据新增员工接口设计对应的DTO&#xff1a; 这是实体类属性&#xff0c;但是由于属性差异过大&#xff0c;使用DTO封装数据为&#xff1a; 当前端提交的数据…

java常见面试题汇总

&#x1f30f;个人博客主页&#xff1a;意疏-CSDN博客 希望文章能够给到初学的你一些启发&#xff5e; 如果觉得文章对你有帮助的话&#xff0c;点赞 关注 收藏支持一下笔者吧&#xff5e; 阅读指南&#xff1a; 开篇说明一、封装 继承 多态1.封装2.继承3.多态 二、什么是重载…

非极大值抑制(Non-Maximum Suppression,简称 NMS)

本文为专栏《Python三维点云实战宝典》系列文章&#xff0c;专栏介绍地址“【python三维深度学习】python三维点云从基础到深度学习_python3d点云从基础到深度学习-CSDN博客”。配套书籍《人工智能点云处理及深度学习算法》提供更加全面和系统的解析。 非极大值抑制&#xff08…