【Vue】Vue3.0(十九)Vue 3.0 中一种组件间通信方式-自定义事件

文章目录

      • 一、自定义事件概念及使用场景
      • 二、代码解释
      • 三、新的示例

一、自定义事件概念及使用场景

  1. 概念
    在 Vue 3.0 中,自定义事件是一种组件间通信的机制,允许子组件向父组件传递数据或触发父组件中的操作。子组件通过defineEmits函数定义可以触发的事件,父组件通过v-on(或@)指令监听子组件触发的这些自定义事件,并在事件处理函数中接收和处理数据。这种方式遵循了单向数据流的原则,同时实现了父子组件之间灵活的数据交互。

  2. 使用场景

    • 用户交互反馈:例如在一个表单组件中,子组件(如输入框组件)可以在用户输入完成并提交时,通过自定义事件将用户输入的值传递给父组件,父组件再进行数据验证和后续处理。
    • 状态更新通知:当子组件内部状态发生变化,且这个变化需要让父组件知晓并做出相应反应时,比如子组件中的某个任务完成状态改变,通过自定义事件通知父组件更新相关显示或执行其他操作。
    • 动态数据传递:子组件根据自身逻辑生成一些数据,需要传递给父组件来更新父组件的视图或进行其他业务逻辑处理,如在一个动态列表组件中,子组件对列表项的操作结果传递给父组件。

二、代码解释

  1. Child.vue 组件
    • 模板部分
<template>
  <div class="child">
    <h3>子组件</h3>
    <h4>玩具:{{ toy }}</h4>
    <button @click="emit('send - toy', toy)">测试</button>
  </div>
</template>

这里定义了一个按钮,当点击按钮时,会触发send - toy自定义事件,并将toy的值作为参数传递出去。

- **脚本部分**:
import { ref, onMounted } from "vue";
// 数据
let toy = ref('奥特曼');
// 声明事件
const emit = defineEmits(['send - toy']);
// //挂载3s之后触发事件
// onMounted(() => {
//   setTimeout(() => {
//     emit('send - toy');
//   }, 3000);
// });
  - 首先,使用`ref`创建了一个响应式数据`toy`,其初始值为`奥特曼`。
  - 然后,通过`defineEmits`定义了`send - toy`这个自定义事件,这使得子组件可以触发这个事件向父组件传递信息。注释部分代码原本是在组件挂载 3 秒后触发`send - toy`事件。
  1. Father.vue 组件
    • 模板部分
<template>
  <div class="father">
    <h3>父组件</h3>
    <h4 v - show="toy">子给的玩具:{{ toy }}</h4>
    <!-- 给子组件Child绑定事件 -->
    <Child @send - toy="saveToy" />
  </div>
</template>

这里在子组件Child标签上使用@send - toy监听了子组件触发的send - toy事件,并将事件处理函数绑定为saveToy。当子组件触发该事件时,父组件中的saveToy函数会被调用。

- **脚本部分**:
import Child from './Child.vue';
import { ref } from "vue";
// 数据
let toy = ref('');
// 用于保存传递过来的玩具
function saveToy(value: string) {
  console.log('saveToy', value);
  toy.value = value;
}
  - 首先,引入了子组件`Child`。
  - 接着,使用`ref`创建了一个响应式数据`toy`,初始值为空字符串。
  - 定义了`saveToy`函数,它接收子组件传递过来的值(这里是玩具名称的字符串),在函数内部,先在控制台打印接收到的值,然后将`toy`的值更新为接收到的值,这样就实现了子组件向父组件传递数据并更新父组件状态的功能。

这里给出一个整体的父子组件的代码概览,更有助于我们的理解
在这里插入图片描述

效果图:
未点击按钮之前:
在这里插入图片描述

点击按钮之后:
在这里插入图片描述

三、新的示例

假设我们有一个包含多个商品卡片的购物车组件,每个商品卡片是一个子组件,当点击商品卡片上的“删除”按钮时,需要通知父组件(购物车组件)从购物车中删除该商品。

  1. 子组件(ProductCard.vue)
<template>
  <div class="product - card">
    <img :src="product.image" alt="Product Image">
    <h4>{{ product.name }}</h4>
    <p>Price: ${{ product.price }}</p>
    <button @click="emit('delete - product', product.id)">删除</button>
  </div>
</template>

<script setup lang="ts" name="ProductCard">
import { defineEmits } from "vue";
import { product } from './productData'; // 假设这里有商品数据

const emit = defineEmits(['delete - product']);
</script>

<style scoped>
.product - card {
  border: 1px solid gray;
  padding: 10px;
  margin: 10px;
  text - align: center;
}
</style>
  1. 父组件(ShoppingCart.vue)
<template>
  <div class="shopping - cart">
    <h2>购物车</h2>
    <div v - for="(product, index) in cartProducts" :key="index">
      <ProductCard :product="product" @delete - product="removeProduct" />
    </div>
  </div>
</template>

<script setup lang="ts" name="ShoppingCart">
import ProductCard from './ProductCard.vue';
import { ref } from "vue";
import { products } from './productData'; // 假设这里有商品数据列表

const cartProducts = ref([...products]); // 模拟购物车中的商品列表

const removeProduct = (productId: number) => {
  const updatedCart = cartProducts.value.filter((product) => product.id!== productId);
  cartProducts.value = updatedCart;
};
</script>

<style scoped>
.shopping - cart {
  background - color: lightgray;
  padding: 20px;
}
</style>

在这个示例中,子组件ProductCard通过自定义事件delete - product将商品的id传递给父组件ShoppingCart,父组件根据id从购物车商品列表中删除对应的商品。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

单片机入门知识

1单片机系统的int是16位 计算机系统的int是32位&#xff08;数据总线&#xff09; 2的16次方是65536 所以在单片机中&#xff0c;如果表示一个正整数&#xff0c;这个数字的范围是0~65535&#xff0c;总共有65536种可能 2内存条用于存储计算机运行时的数据&#xff0c;是连接…

【高等数学】6向量与空间几何

1. 向量及其运算 1.1. 单向量的计算 向量的模的计算 单位向量的计算 1. 计算模: 2. 向量除以它的模: 1.2. 向量的点乘 点乘的计算 点乘:算出来的是一个数,所以点乘又称为向量的数量积。 向量点乘的计算公式: 向量的夹角计算 向量的夹角公式: 向量间平行垂直的…

Linux进程信号(信号的产生)

目录 什么是信号&#xff1f; 信号的产生 信号产生方式1&#xff1a;键盘 前台进程 后台进程 查看信号 signal系统调用 案例 理解进程记录信号 软件层面 硬件层面 信号产生方式2:指令 信号产生方式3:系统调用 kill系统调用 案例 其他产生信号的函数调用 1.rais…

7.qsqlquerymodel 与 qtableview使用

目录 qtableview 委托QStyledItemDelegateQAbstractItemDelegateCheckBoxItemDelegate使用qtableview控制列宽&#xff0c;行高&#xff0c;隐藏拖拽行列 qtableview 委托 //设置单元格委托 void setItemDelegate(QAbstractItemDelegate *delegate); QAbstractItemDelegate *it…

利用 Avalonia UI 构建 Blazor 混合应用程序

Blazor 是一个 .NET 前端框架&#xff0c;用于仅使用 .NET 技术构建 Web 应用程序。2021 年&#xff0c;Blazor 扩展到桌面端&#xff0c;推出了 Blazor Hybrid&#xff08;混合&#xff09;&#xff0c;使开发者可以在桌面平台上使用已有的技能。 Blazor 混合应用程序是传统的…

MFC中Excel的导入以及使用步骤

参考地址 在需要对EXCEL表进行操作的类中添加以下头文件&#xff1a;若出现大量错误将其放入stdafx.h中 #include "resource.h" // 主符号 #include "CWorkbook.h" //单个工作簿 #include "CRange.h" //区域类&#xff0c;对Excel大…

【深入浅出】Linux进程(三)

&#x1f4c3;博客主页&#xff1a; 小镇敲码人 &#x1f49a;代码仓库&#xff0c;欢迎访问 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f30f; 任尔江湖满血骨&#xff0c;我自踏雪寻梅香。 万千浮云遮碧…

2024 第五次周赛

A: 直接遍历即可 #include<bits/stdc.h> using namespace std;typedef long long ll; typedef pair<ll, ll>PII; const int N 2e6 10; const int MOD 998244353; const int INF 0X3F3F3F3F;int n, m; int main() {cin >> n;int cnt 0;for(int i 0; i …

gitlab无法创建合并请求是所有分支都不显示

点击Merge Requests ------> New merge request 创建新的合并请求时&#xff0c;在Source branch和Target branch中一个分支都不显示 排查思路&#xff1a; 1.怀疑是权限问题。 发现只有我的一个账号出现&#xff0c;检查了账号的权限&#xff0c;尝试了master、develop角色…

Linux中给普通账户一次性提权

我在以前文章中Linux常见指令大全&#xff08;必要知识点&#xff09;-CSDN博客 写过sudo的概念与用法。其实本质就是提权用的但是在某些场景下就算提权了也不能使用。 例如&#xff1a;打开主工作目录 他不相信你这个用户&#xff0c;虽然你是erman 解决方法 使用root账号打开…

【C++】—掌握STL string类:string的模拟实现

文章目录 &#x1f49e;1.浅拷贝&#x1f49e;2.深拷贝&#x1f49e;3. string类的模拟实现&#x1f49e;3.1 string的构造函数&#x1f49e;3.2 string的析构函数&#x1f49e;3.3 string的拷贝构造&#x1f49e;3.4 string的size&#x1f49e;3.5 string的operator[]&#x1…

详解基于C#开发Windows API的SendMessage方法的鼠标键盘消息发送

在C#中&#xff0c;SendMessage方法是一个强大的工具&#xff0c;它允许我们与Windows API交互&#xff0c;模拟键盘和鼠标事件。本文将详细介绍如何使用SendMessage方法来发送鼠标和键盘消息。 1. SendMessage方法概述 SendMessage是Windows API中的一个函数&#xff0c;它用…

15.UE5等级、经验、血条,魔法恢复和消耗制作

2-17 等级、经验、血条、魔法消耗_哔哩哔哩_bilibili 目录 1.制作UI&#xff0c;等级&#xff0c;经验&#xff0c;血条 ​2.为属性面板绑定角色真实的属性&#xff0c;实现动态更新 3.魔法的消耗和恢复 1.制作UI&#xff0c;等级&#xff0c;经验&#xff0c;血条 创建控…

<项目代码>YOLOv8 玉米地杂草识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

现场工程师日记-MSYS2迅速部署PostgreSQL主从备份数据库

文章目录 一、概要二、整体架构流程1. 安装 MSYS2 环境2. 安装postgresql 三、技术名词解释1.MSYS22.postgresql 四、技术细节1. 创建主数据库2.添加从数据库复制权限3. 按需修改参数&#xff08;1&#xff09;WAL保留空间&#xff08;2&#xff09;监听地址 4. 启动主服务器5.…

堆排序与链式二叉树:数据结构与排序算法的双重探索

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 引言 一.堆排序 1.1 版本一 核心概念 堆排序过程 1.2 版本二 堆排序函数 HeapSort 向下调整算法 AdjustDown 向上调整算法 AdjustUp 二.链式二叉树 2.1 前中后序遍历 链式二叉树的结构 创建链式二叉树 前序遍历…

【LinuxC编程】06 - 守护进程,线程

进程组和会话 概念和特性 进程组&#xff0c;也称之为作业。BSD于1980年前后向Unix中增加的一个新特性。代表一个或多个进程的集合。每个进程都属于一个进程组。在waitpid函数和kill函数的参数中都曾使用到。操作系统设计的进程组的概念&#xff0c;是为了简化对多个进程的管…

【MongoDB】MongoDB的聚合(Aggregate、Map Reduce)与管道(Pipline) 及索引详解(附详细案例)

文章目录 MongoDB的聚合操作&#xff08;Aggregate&#xff09;MongoDB的管道&#xff08;Pipline操作&#xff09;MongoDB的聚合&#xff08;Map Reduce&#xff09;MongoDB的索引 更多相关内容可查看 MongoDB的聚合操作&#xff08;Aggregate&#xff09; 简单理解&#xff…

Python的函数(补充浅拷贝和深拷贝)

一、定义 函数的定义&#xff1a;实现【特定功能】的代码块。 形参&#xff1a;函数定义时的参数&#xff0c;没有实际意义 实参&#xff1a;函数调用/使用时的参数&#xff0c;有实际意义 函数的作用&#xff1a; 简化代码提高代码重用性便于维护和修改提高代码的可扩展性…

Unity常见问题合集(一)

PS&#xff1a;不定期更新...... 目录 &#xff08;1&#xff09;无法关闭自动编译&#xff08;Edit — Preference — General — Auto Refresh&#xff09; &#xff08;1&#xff09;无法关闭自动编译&#xff08;Edit — Preference — General — Auto Refresh&#xff0…