当前位置: 首页 > news >正文

Vue 3 的 emit 简单使用

在 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、避免滥用事件

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 驱动开发系列13 - Linux Graphics 图形驱动概述(二)
  • SQL手工注入漏洞测试(MongoDB数据库)
  • Xmind 在线导图上线!多设备实时同步,节约本地空间
  • 【Kotlin】在Kotlin项目中使用AspectJ
  • Python核心编程--Python要点总结
  • Swift 内存管理:精通强、弱、无主之地
  • IOS半越狱工具nathanlr越狱教程
  • 计算机毕业设计选题推荐-Cosplay论坛系统-Java/Python项目实战
  • 【UE5.1】NPC人工智能——06 NPC攻击
  • 在Ubuntu 部署 Grafana且监控MySQL数据
  • PDF文件切割,无大小限制
  • WPF中的XAML是如何转换成对象的?
  • react面试题一
  • Vue实现表格数据的增删改查
  • 死锁如何产生及避免
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Akka系列(七):Actor持久化之Akka persistence
  • Consul Config 使用Git做版本控制的实现
  • css系列之关于字体的事
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • MD5加密原理解析及OC版原理实现
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • PHP的Ev教程三(Periodic watcher)
  • Selenium实战教程系列(二)---元素定位
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • vue-cli3搭建项目
  • 阿里云购买磁盘后挂载
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 小程序01:wepy框架整合iview webapp UI
  • 小试R空间处理新库sf
  • 优化 Vue 项目编译文件大小
  • 通过调用文摘列表API获取文摘
  • 整理一些计算机基础知识!
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #Z2294. 打印树的直径
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • ()、[]、{}、(())、[[]]命令替换
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (Note)C++中的继承方式
  • (SpringBoot)第二章:Spring创建和使用
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • .htaccess配置常用技巧
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .Net 6.0--通用帮助类--FileHelper
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .net 无限分类
  • .net6 当连接用户的shell断掉后,dotnet会自动关闭,达不到长期运行的效果。.NET 进程守护
  • .net专家(张羿专栏)
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • ?php echo ?,?php echo Hello world!;?