【Vue3】组件通信之自定义事件

news2024/11/14 22:06:30

【Vue3】组件通信之自定义事件

  • 背景
  • 简介
  • 开发环境
  • 开发步骤及源码
  • 总结

背景

随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗的日子。本文内容并非完全原创,大多是参考其他文章资料整理所得,感谢每位技术人的开源精神。

简介

本文介绍 Vue3 中如何通过自定义事件实现子组件向父组件传数据。

Vue3 中组件间通信包括:

  • 父组件向子组件传数据,实现方案有:
    • props
    • v-model
    • $ref
    • 默认插槽 / 具名插槽
  • 子组件向父组件传数据
    • props
    • v-model
    • $parent
    • 自定义事件
    • 作用域插槽
  • 父组件向子组件的子组件传数据,即向孙子组件传数据
    • $attrs
    • provider & inject
  • 任意组件间传数据
    • mitt
    • Pinia

开发环境

分类名称版本
操作系统WindowsWindows 11
IDEVisual Studio Code1.91.1

开发步骤及源码

1> 在 【Vue3】组件通信之props 基础上修改 Vue 根组件 src/App.vue,在子组件标签上添加一个自定义事件 sync-read-times

<template>
  <div class="parent">
    <h1>父组件</h1>
    <h2>Blog数量:{{ blogs.length }}</h2>
    <h2>浏览数量:{{ readTimes }}</h2>
    <!-- 给子组件绑定了一个 sync-read-times 事件,只要 sync-read-times 被触发,其指向的 syncReadTimes 函数就会被调用 -->
    <Blog :blogs="blogs" :author="author" @sync-read-times="syncReadTimes" />
  </div>
</template>

<script setup lang="ts">
import Blog from './components/Blog.vue'
import { reactive, ref } from 'vue'

const author = ref('Nick')

const blogs = reactive([
  { id: '001', title: '美国大选', content: '美国大选将于...' },
  { id: '002', title: '奥运奖牌', content: '截止今日奥运奖牌榜...' },
  { id: '003', title: '俄乌战争', content: '乌克兰单方面提出希望和谈...' },
  { id: '004', title: '巴以冲突', content: '巴以冲突最新战况...' },
])

const readTimes = ref(0)

function syncReadTimes(value) {
  readTimes.value += value
}
</script>

<style scoped lang="scss">
.parent {
  background-color: orange;
  padding: 20px;
}
</style>

2> 修改子组件,使用 defineEmits 函数声明接收的父组件自定义事件 sync-read-times,然后修改 <button> 点击事件为触发自定义事件 sync-read-times

<template>
    <div class="content">
        <h1>子组件</h1>
        <div class="blog" v-for="blog in blogs" :key="blog.id">
            <div class="blog-title">标题:{{ blog.title }}</div>
            <div class="blog-author">作者:{{ author }}</div>
            <div class="blog-content">{{ blog.content }}</div>
            <button @click="emits('sync-read-times', 1)">浏览量+1</button>
        </div>
    </div>
</template>

<script setup lang="ts">
const data = defineProps(['author', 'blogs'])
// 声明事件
const emits= defineEmits(['sync-read-times'])
</script>

<style scoped lang="scss">
.content {
    background-color: aquamarine;
    padding: 20px;
    .blog {
        border: 1px solid gray;
        border-radius: 5px;
        padding: 0 10px;
        margin-top: 5px;
        div {
            padding: 10px 5px;
        }
        .blog-title {
            font-weight: bold;
        }
        .blog-author {
            font-size: small;
            font-style: italic;
        }
        .blog-content {
            font-size: small;
        }
        button {
            margin: 10px 0;
        }
    }
}
</style>

3> 执行命令 npm run dev 启动应用,浏览器访问:http://localhost:5173/。点击子组件中按钮,父组件中的 浏览数量 随按钮点击次数增加。
在这里插入图片描述

总结

使用自定义事件实现子组件向父组件传数据:

  1. 父组件需要在子组件标签上自定义事件,格式:@事件名="函数名",如本例中的 @sync-read-times="syncReadTimes",当子组件触发自定义事件 sync-read-times 时,父组件的函数 syncReadTimes 就会被调用;
  2. 子组件使用 defineEmits 声明接收的父组件自定义事件,defineEmits 函数参数为自定义事件名称数组;
  3. 子组件根据实际需求触发自定义事件,触发自定义事件函数(本例中的 emits('sync-read-times', 1))的第一个参数为自定义事件名,后面跟随自定义事件对应的父组件中函数的参数(参数数量不定),即向父组件传的数据。

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

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

相关文章

【重整化群】1.0 to Wilson RG

0. 写在最前面 从高能到统计物理模型RG的技术主要参考 大黄猫的量子多体讲义&#xff0c;杨展如NRG / DMRG 暂时没有想法&#xff0c;编排不出内容有趣的零碎内容&#xff0c;如 CFT&#xff0c;Z2 Lattice gauge, Fermi field 重整化零碎内容&#xff0c;下篇文章将逐一讲述 …

UE5.4内容示例(4)UI_UMG - 学习笔记

https://www.unrealengine.com/marketplace/zh-CN/product/content-examples 《内容示例》是学习UE5的基础示例&#xff0c;可以用此熟悉一遍UE5的功能 UI示例 UI_UMG &#xff1a;基本UMGUI_CommonUI &#xff1a;UMG多层应用UI_SlatePostBuffer UI &#xff1a;FX的示例&…

python中的print函数总结

文章目录 打印变量打印数学计算多行文本复制n次字符串 x*n,n*x不换行输出多个数据换行符制表位转义原字符字符串切片格式化字符串千位分隔符&#xff08;只适用于整数和浮点数&#xff09;浮点数小数部分的精度字符串类型&#xff0c;.表示最大的显示长度整数类型浮点数类型 打…

<Qt> 常用控件

目录 一、控件概述 二、QWidget 核心属性 &#xff08;一&#xff09;QWidget的核心属性概览 1. enabled 2. geometry 3. WindowFrame的影响 4. windowTitle 5. window Icon 6. windowOpacity 7. cursor 8. font 9. toolTip 10. focusPolicy 11. styleSheet 三、…

docker网络介绍net

docker 几种网络模式 bridge模式 使用–netbridge参数指定网络模式&#xff0c;docker的默认模式就是bridge模式&#xff0c;默认选择bridge的情况下&#xff0c;容器启动的时候会通过DHCP获取一个ip地址&#xff0c;这可能不是我们想要的&#xff0c;在centos系统下&#xff…

springboot给类进行赋初值的四种方式

目录 1. 使用Value和ConfigurationProperties2. 使用PropertySource创建Person.java写一个测试类 3. 使用ImportResourceStudent类创建beans.xml在主类中引入测试 心得 1. 使用Value和ConfigurationProperties 这里不加赘述了&#xff0c;前面我也发过&#xff0c;这里就放个链…

redis--分布式锁(1)

分布式锁的基本需求 互斥性&#xff1a;在任何时刻&#xff0c;只有一个客户端能持有锁。无死锁&#xff1a;即使一个客户端在持有锁的期间崩溃&#xff0c;其他客户端也能获得锁。容错性&#xff1a;分布式锁的实现应该能够容忍部分组件的失败&#xff0c;例如&#xff0c;锁服…

Open Interpreter - 开放解释器

文章目录 一、关于演示它是如何工作的&#xff1f;与 ChatGPT 的代码解释器比较 二、快速开始三、更多操作1、互动聊天2、程序化聊天3、开始新的聊天4、保存和恢复聊天5、自定义系统消息6、更改模型7、在本地运行 Open Interpreter终端Python上下文窗口&#xff0c;最大令牌 8、…

JavaScript异步编程的Promise

目录 1.对Promise的了解 &#xff08;1&#xff09;介绍 &#xff08;2&#xff09;Promise 的优缺点 2.Promise的基本用法 &#xff08;1&#xff09;创建Promise对象 &#xff08;2&#xff09;Promise方法then() &#xff08;3&#xff09;Promise方法catch() &…

力扣SQL50 删除重复的电子邮箱 自连接删除 连表删除

Problem: 196. 删除重复的电子邮箱 &#x1f468;‍&#x1f3eb; 参考题解 Code DELETE p1 FROM Person p1,Person p2 WHEREp1.Email p2.Email AND p1.Id > p2.Id

前端Web-JavaScript(下)

主要是补全一下JavaScript 基本对象: String对象 语法格式 方式1&#xff1a; var 变量名 new String("…") ; //方式一 例如&#xff1a; var str new String("Hello String"); 方式2&#xff1a; var 变量名 … ; //方式二 例如&#xff1a; var …

CHCSA第二次作业

#01、创建以上目录和文件结构&#xff0c;并将/yasuo目录拷贝4份到/目录下 [rootlocalhost ~]# ls /yasuo // 先检查是否有yasuo目录 ls: 无法访问 /yasuo: 没有那个文件或目录 [rootlocalhost ~]# mkdir -p /yasuo/dir1 // 递归创建目录 [rootlocalhost ~]#…

Pandas的30个高频函数使用介绍

Pandas是Python中用于数据分析的一个强大的库&#xff0c;它提供了许多功能丰富的函数。本文介绍其中高频使用的30个函数。 read_csv(): 从CSV文件中读取数据并创建DataFrame对象。 import pandas as pd df pd.read_csv(data.csv) read_excel(): 从Excel文件中读取数据…

嗖嗖移动业务大厅(JDBC)

一、项目介绍 1、项目背景: 该项目旨在模拟真实的移动业务大厅&#xff0c;。用户可以注册新卡、查询账单、管理套餐、充值话费、打印消费记录等功能。同时&#xff0c;项目还模拟了用户使用场景&#xff0c;如通话、上网、发短信等&#xff0c;并根据套餐规则进行相应的扣费…

AutoCAD ObjectArx二次开发(二) 关于程序入口的介绍

在上一章节中&#xff0c;我们介绍了环境搭建和程序插件的加载&#xff0c;基本的编程模板&#xff08;框架&#xff09;已经准备就绪。接下来&#xff0c;我们将开始编写自己的业务逻辑。ARX开发的核心在于将自定义函数注册到库中&#xff0c;并通过指定的调用命令来实现功能。…

【论文解读|Data Intelligence】 Large Knowledge Model: Perspectives and Challenges

论文链接&#xff1a;Large Knowledge Model: Perspectives and Challenges (sciengine.com) 来源&#xff1a; Data Intelligence 论文介绍&#xff1a; 文章简述了人类语言和世界知识的紧密关系&#xff0c;对比了语言模型和知识图谱在表示和处理人类知识方面的优缺点&…

Candance Allegro 入门教程笔记:PCB封装库的组成元素

文章目录 一、PCB封装库的组成元素二、使用Padstack Edictor制作封装焊盘引脚三、PCB Editor软件创建贴片封装&#xff08;STM32F103T8U6 QFN36 为例&#xff09;1.引入库2.读入数据 一、PCB封装库的组成元素 一般来说&#xff0c;针对于Allegro软件&#xff0c;完整的封装是由…

blender里的辉光

cycle的辉光&#xff0c; 点开支持后期效果 eevee的辉光&#xff0c;直接点bloom就行。 eevee的透明

GORM更新操作(Save、Update、Updates)

在 Go 语言的 Web 开发中&#xff0c;GORM 是一个广泛使用的 ORM (Object-Relational Mapping) 框架。它提供了一种流畅的方式来处理数据库的交互&#xff0c;其中包括记录的更新操作。GORM中的更新操作主要是update、updates、save这几种 操作前的准备工作&#xff1a;声明模…

C语言进阶版第五课—函数递归

文章目录 1. 什么是函数递归2. 函数递归的思想3. 函数递归的限制4. 函数递归练习4.1 n的阶乘4.2 按照顺序打印一个整数的每一位4.3 自定义函数不允许创建变量&#xff0c;求字符串长度 1. 什么是函数递归 函数递归就是函数自己调用自己 图片中的函数test&#xff08;&#xff0…