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

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>
http://www.cnnetsun.cn/news/97913.html

相关文章:

  • Obsidian Style Settings 插件终极使用指南:快速掌握个性化定制技巧
  • Jellyfin插件MetaShark中TMDB刮削缓慢问题的深度排查与优化方案
  • 移动端AI绘图新突破:用TensorFlow Lite搞定denoising-diffusion实战指南
  • 抖音下载神器:揭秘批量保存直播回放的技术工具
  • 抖音直播下载终极指南:一键保存精彩回放
  • Motrix扩展:3步实现浏览器下载效率300%提升
  • Motrix浏览器扩展终极指南:解锁专业下载管理新境界
  • 解锁B站缓存新姿势:m4s-converter视频转换完全指南
  • LobeChat自动伸缩策略:根据GPU负载动态调整实例数量
  • 团队成长阶段的管理重点
  • 贪心算法:像“贪吃蛇”一样,永远只吃眼前的苹果?
  • java计算机毕业设计文华社区医生预约管理系统的设计与实现 社区医疗在线挂号与诊疗排班平台的设计与实现 居民健康服务预约系统开发
  • Swagger2Word终极指南:3分钟快速将API文档转为专业Word格式
  • LobeChat用户行为追踪:借助GA4收集使用数据
  • Llama-2-7B聊天模型完整部署实战指南:从零到企业级应用
  • 从零到上线:5分钟快速部署LobeChat镜像并接入Token服务
  • 21、分布式监控与Web界面使用指南
  • EmotiVoice语音合成在博物馆导览系统中的落地实践
  • 31、Nagios CGI 配置详解
  • LobeChatCTA按钮文案优化建议
  • 零基础学网安创新?8 大方向 + 学习路径(超详细),入门到精通看这篇
  • 挖到宝了!2025 网安 200 万缺口,零基础→年薪 50W 路径全公开
  • 19、量子计算:理论与实践探索
  • Windows美化神器ExplorerBlurMica:打造个性化文件管理界面的完整教程
  • AutoCAD字体缺失终极解决方案:智能管理工具全面解析
  • EmotiVoice语音多样性测试:避免重复单调输出
  • LobeChat注册流程简化方案
  • 8、离线下载系统:云与智能AP的性能剖析
  • 有声读物制作新利器:EmotiVoice让朗读更自然生动
  • 3步搞定OFD转PDF:零基础也能快速上手的文档转换指南