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

news2024/11/24 7:49:09

文章目录

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

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

  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从购物车商品列表中删除对应的商品。

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

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

相关文章

成功解决WSL2上的Ubuntu22.04执行sudo apt-get update指令报错问题

问题&#xff1a;输入sudo apt-get update指令会显示如下报错 问题所在&#xff1a;Temporary failure in name resolution 显然是系统无法解析域名。这可能是 DNS 配置问题。 解决方案&#xff1a; 临时修改 DNS 配置 尝试手动修改 /etc/resolv.conf 文件来使用公共 DNS 服务…

L1G3000 提示工程(Prompt Engineering)

什么是Prompt(提示词)? Prompt是一种灵活、多样化的输入方式&#xff0c;可以用于指导大语言模型生成各种类型的内容。什么是提示工程? 提示工程是一种通过设计和调整输入(Prompts)来改善模型性能或控制其输出结果的技术。 六大基本原则: 指令要清晰提供参考内容复杂的任务拆…

探索Python的Shell力量:Plumbum库揭秘

文章目录 探索Python的Shell力量&#xff1a;Plumbum库揭秘第一部分&#xff1a;背景介绍第二部分&#xff1a;Plumbum是什么&#xff1f;第三部分&#xff1a;如何安装Plumbum&#xff1f;2. 创建管道3. 重定向4. 工作目录操作5. 前台和后台执行 第五部分&#xff1a;场景应用…

点击文本将内容填入tinymce-vue 富文本编辑器的光标处

富文本编辑器组件 <template><div ref"tinymceBox" class"tinymce-box"><Editor id"myEditor" v-model"contentValue" :init"init" :disabled"disabled" blur"inputBlur" click"o…

星海智算:风月ComfyUI_SD3.5

&#xff08;一&#xff09;镜像介绍 1、风月ComfyUI_SD3.5​ 占用69.71G磁盘&#xff0c;为用户预留了近30个G使用。 2、SD3.5​ SD3.5&#xff0c;即Stable Diffusion 3.5&#xff0c;是Stability AI推出的最新图像生成模型&#xff0c;是Stable Diffusion 3.0版本的升级版…

在模方置平建筑失败的原因是什么?

在模方置平建筑失败的原因是什么&#xff1f; 可能是obj拓扑不连续&#xff0c;可以在网格大师使用osgb转obj功能&#xff0c;选择拓扑或者重建。 网格大师是一款能够解决实景三维模型空间参考、原点、瓦块大小不统一&#xff0c;重叠区域处理问题的工具“百宝箱”&#xff0c…

python 语言入门

目录 1.发展历程 2.优缺点 3.环境搭建 3.1.Anaconda 3.2.VSCode 3.3.重装自己的独立环境 4.第一个 python 程序 4.1.创建一个 .py 的文件 4.2.编写 python 代码 ​4.3.运行 python 代码 5.注释 5.1.单行注释 5.2.多行注释 6.转义字符 7.变量 7.1.变量类型 7.2…

C++11 --- 智能指针详解

C11 智能指针 一、智能指针的使用场景分析二、RAII和智能指针的设计思路三、智能指针的本质及衍生的问题四、C标准库的智能指针的使用五、智能指针的原理&#xff08;模拟实现&#xff09;1. auto_ptr的模拟实现2. unique_ptr的模拟实现3. shared_ptr的模拟实现&#xff08;简单…

(实战)WebApi第13讲:怎么把不同表里的东西,包括同一个表里面不同的列设置成不同的实体,所有的给整合到一起?【前端+后端】、前端中点击标签后在界面中显示

一、实现全局跨域&#xff1a;新建一个Controller&#xff0c;其它的controller都继承它 1、新建BaseController 2、在后端配置&#xff0c;此处省略【详情见第12讲四、3、】 3、其它的控制器继承BaseController&#xff0c;这个时候就能够完成全局的跨域 【向后台传cookie和…

【C++】map和set的介绍及使用

前言&#xff1a; map和 set 是 C STL&#xff08;标准模板库&#xff09;中的两种非常重要的容器&#xff0c;它们基于一种叫做平衡二叉搜索树&#xff08;通常是红黑树&#xff09;的数据结构来实现。在 C 中&#xff0c;map 是一个键值对容器&#xff0c;set 只存储唯一的键…

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

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

el-input 正则表达式校验输入框不能输入汉字

<el-form :model"data1" :rules"rules" ref"ruleForm" label-width"210px" class"demo-ruleForm"><el-form-item label"锯路&#xff1a;" prop"sawKref"><el-input class"inptWid…

嵌入式linux系统中I2C控制实现AP3216C传感器方法

大家好,今天主要给大家分享一下,如何使用linux系统里面的I2C进行控制实现。 第一:Linux系统中I2C简介 Linux 内核开发者为了让驱动开发工程师在内核中方便的添加自己的 I2C 设备驱动程序,更容易的在 linux 下驱动自己的 I2C 接口硬件,进而引入了 I2C 总线框架。与 Linux 下…

OceanBase 应用实践:如何处理数据空洞,降低存储空间

问题描述 某保险行业客户的核心系统&#xff0c;从Oracle 迁移到OceanBase之后&#xff0c;发现数据存储空间出现膨胀问题&#xff0c;数据空间 datasize9857715.48M&#xff0c;实际存储占用空间17790702.00M。根据 required_mb - data_mb 值判断&#xff0c;数据空洞较为严重…

【flask开启进程,前端内容图片化并转pdf-会议签到补充】

flask开启进程,前端内容图片化并转pdf-会议签到补充 flask及flask-socketio开启threading页面内容转图片转pdf流程前端主js代码内容转图片-browser端browser端的同步编程flask的主要功能route,def 总结 用到了pdf,来回数据转发和合成,担心flask卡顿,响应差,于是刚好看到threadi…

QT栅格布局的妙用

当groupBox中只有一个控件时&#xff0c;我们想要它满格显示可以对groupBox使用栅格布局

MyBatis快速入门(上)

MyBatis快速入门&#xff08;上&#xff09; 一、MyBatis 简介1、概述2、JDBC、Hibernate、MyBatis 对比 二、MyBatis 框架搭建1、开发环境2、创建maven工程3、创建MyBatis的核心配置文件4、创建mapper接口5、创建MyBatis的映射文件6、通过junit测试功能7、加入log4j2日志功能 …

在Pybullet中加载Cinema4D创建的物体

首先明确我们的目标&#xff0c;是希望在cinema4D中创建自己想要的模型&#xff0c;并生成.obj文件&#xff0c;然后在pybullet中加载.obj文件作为静态物体&#xff0c;可以用于抓取物体&#xff0c;避障物体。&#xff08;本文提到的方法只能实现静态物体的建模&#xff0c;如…

第十三届交通运输研究(上海)论坛┆智能网联汽车技术现状与研究实践

0.简介 交通运输研究&#xff08;上海&#xff09;论坛&#xff08;简称为TRF&#xff09;是按照国际会议的组织原则&#xff0c;为综合交通运输领域学者们构建的良好合作交流平台。交通运输研究&#xff08;上海&#xff09;论坛已经成功举办了十二届&#xff0c;凝聚了全国百…

Pr:视频过渡快速参考(合集 · 2025版)

Adobe Premiere Pro 自带七组约四十多个视频过渡 Video Transitions效果&#xff0c;包含不同风格和用途&#xff0c;可在两个剪辑之间创造平滑、自然的转场&#xff0c;用来丰富时间、地点或情绪的变化。恰当地应用过渡可让观众更好地理解故事或人物。 提示&#xff1a; 点击下…