news 2026/6/14 20:16:31

VUE3:深入浅出自定义事件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
VUE3:深入浅出自定义事件

什么是自定义事件?

自定义事件是子组件向父组件"发信号"。比如子组件的按钮被点击了,需要通知父组件执行某些操作。也就是Vue中子组件向父组件通信的机制。子组件通过defineEmits声明事件(数组或对象形式),在特定操作时用emit()触发事件并传递数据。父组件通过@事件名监听这些事件,接收子组件传递的参数并执行相应操作。

以下示例展示了子组件触发click、submit、delete三种事件,父组件接收并处理这些事件及附带的数据,实现组件间的交互通信。

基本使用

子组件(发送事件)
<template> <div class="child"> <h3> 子组件 - 自定义事件示例</h3> <!-- 点击按钮时发送不同的事件 --> <button @click="handleClick">发送点击事件</button> <button @click="handleSubmit">提交表单</button> <button @click="handleDelete">删除操作</button> </div> </template> <script setup> // ======================================== // 第一步:使用 defineEmits 声明事件 // ======================================== // 方式1:数组形式(简单) const emit = defineEmits(['click', 'submit', 'delete']) // 方式2:对象形式(可以做参数验证) // const emit = defineEmits({ // click: null, // 不需要验证 // submit: (payload) => { // // 验证函数,返回 true 表示验证通过 // if (payload.username && payload.password) { // return true // } // console.warn('提交数据不完整') // return false // }, // delete: (id) => typeof id === 'number' // }) // ======================================== // 第二步:在需要的时候发送事件 // ======================================== const handleClick = () => { // emit(事件名) emit('click') console.log('已发送 click 事件') } const handleSubmit = () => { // emit(事件名, 参数) - 可以传递数据给父组件 emit('submit', { username: '张三', password: '123456', timestamp: Date.now() }) } const handleDelete = () => { // 可以传递多个参数 emit('delete', 1001, '确认删除') } </script>
父组件(监听事件)
<template> <div class="parent"> <h2> 父组件 - 监听子组件事件</h2> <!-- 使用 @事件名 监听子组件的自定义事件 事件名使用 kebab-case(短横线)命名 --> <ChildEvents @click="onChildClick" @submit="onChildSubmit" @delete="onChildDelete" /> <!-- 显示接收到的数据 --> <div class="log"> <p>点击次数: {{ clickCount }}</p> <p>最近提交: {{ lastSubmit }}</p> <p>删除记录: {{ deleteLog }}</p> </div> </div> </template> <script setup> import { ref } from 'vue' import ChildEvents from './ChildEvents.vue' const clickCount = ref(0) const lastSubmit = ref(null) const deleteLog = ref('') // 处理点击事件 const onChildClick = () => { clickCount.value++ console.log('父组件收到了点击事件') } // 处理提交事件(接收子组件传递的数据) const onChildSubmit = (formData) => { lastSubmit.value = formData console.log('父组件收到表单数据:', formData) } // 处理删除事件(接收多个参数) const onChildDelete = (id, message) => { deleteLog.value = `删除ID: ${id}, 消息: ${message}` console.log('父组件收到删除请求:', id, message) } </script>
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/14 11:55:16

22、SNMP与跨平台Unix编程:Python的强大应用

SNMP与跨平台Unix编程:Python的强大应用 1. SNMP查询与工具创建 SNMP(简单网络管理协议)在网络管理中扮演着重要角色。首先,我们来看一个SNMP查询的例子: Running snmp query for: 10.0.1.20sysDescr = None ( None ) 10.0.1.20 returns (Linux localhost.localdoma…

作者头像 李华
网站建设 2026/6/13 18:53:26

如何在本地部署EmotiVoice开源TTS模型?完整教程

如何在本地部署 EmotiVoice 开源 TTS 模型&#xff1f;完整实战指南 你有没有想过&#xff0c;让一段文字“说出”愤怒、喜悦甚至哽咽的语气&#xff1f;或者只需几秒钟录音&#xff0c;就让 AI 用亲人的声音为你朗读文章&#xff1f;这些曾经属于科幻场景的能力&#xff0c;如…

作者头像 李华
网站建设 2026/6/14 18:00:11

30、Python 并发编程:线程、进程与守护进程全解析

Python 并发编程&#xff1a;线程、进程与守护进程全解析1. 线程编程基础在 Python 中&#xff0c;线程是实现并发的一种重要方式。以下是一个简单的线程池示例代码&#xff1a;worker.start() #spawn pool of arping threads for i in range(num_arp_threads):worker Thread(…

作者头像 李华
网站建设 2026/6/12 15:17:03

DeepSeek-Math 数学AI实战指南:7个核心技巧让你快速上手

DeepSeek-Math 数学AI实战指南&#xff1a;7个核心技巧让你快速上手 【免费下载链接】DeepSeek-Math 项目地址: https://gitcode.com/GitHub_Trending/de/DeepSeek-Math 还在为复杂的数学问题发愁吗&#xff1f;DeepSeek-Math这个强大的数学推理AI工具&#xff0c;能帮…

作者头像 李华
网站建设 2026/6/14 23:27:44

函数指针结构体在单片机应用,怎么理解与回到函数区别

在单片机应用中,回调函数是一种 “间接调用函数” 的编程思想,而函数指针结构体是对回调函数的 “存储、组织和封装方式”—— 两者并非对立关系,而是 **“设计思想” 与 “实现载体”的关系。函数指针结构体解决了单一回调函数在单片机中多实例管理、状态与回调分离、模块化…

作者头像 李华
网站建设 2026/6/10 5:58:36

Shutter Encoder视频转换神器:从小白到高手的效率革命

还在为视频格式转换而烦恼吗&#xff1f;想要一次性处理上百个媒体文件却苦于找不到合适的工具&#xff1f;今天我要向你介绍一款真正改变游戏规则的多媒体处理工具——Shutter Encoder视频转换神器。这款基于FFmpeg的专业工具&#xff0c;让复杂的视频操作变得像拖拽一样简单。…

作者头像 李华