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

Vue组件通信方式

1.props通信

1.1在 Vue 2 中使用 props 通信

注意:props传递的数据是只读的,子组件修改,不会影响父组件

1.1.1.定义 props

在子组件中使用 props 选项来定义要接收的属性

// 子组件
<script>
export default {props: {message: String}
}
</script>
1.1.2.传递props

在父组件中使用子组件时,通过将属性绑定到子组件的属性名来传递数据。

// 父组件
<template><child-component :message="parentMessage"></child-component>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: {ChildComponent},data() {return {parentMessage: 'Hello from parent!'};}
}
</script>
1.1.3.接收props
// 子组件
<template><div>{{ message }}</div>
</template><script>
export default {props: {message: String}
}
</script>

1.2在Vue3中使用props通信

在 Vue 3 中,props 的使用方式与 Vue 2 类似,但有一些额外的特性,如默认值和类型校验的语法略有不同。

1.2.1.定义props
// 子组件
<script setup>const props = defineProps({message: String});//或者
const props = defineProps(['message']);
</script>
1.2.2.传递props
// 父组件
<template><child-component :message="parentMessage"></child-component>
</template><script setup>
import ChildComponent from './ChildComponent.vue';const parentMessage=ref('Hello from parent!')
</script>
1.2.3.接收props
// 子组件
<template><div>{{ props.message }}</div>
</template><script setup>
const props = defineProps({message: String});//或者
const props = defineProps(['message']);</script>

2.自定义事件

2.1在vue2中使用自定义事件

2.1.1.触发自定义事件

在子组件中,使用 $emit 方法触发一个自定义事件。

// 子组件
<template><button @click="emitCustomEvent">触发事件</button>
</template><script>
export default {methods: {emitCustomEvent() {this.$emit('custom-event-name', eventData);}}
}
</script>
2.1.2.监听自定义事件

在父组件中,通过在子组件上使用 v-on(或简写为 @)来监听自定义事件。

// 父组件
<template><child-component @custom-event-name="handleCustomEvent"></child-component>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: {ChildComponent},methods: {handleCustomEvent(eventData) {// 处理自定义事件触发的逻辑}}
}
</script>

2.2在 Vue 3 中使用自定义事件通信

2.2.1.触发自定义事件

在子组件中,首先,我们导入了 defineEmits 函数,然后使用它来定义可触发的自定义事件,就像之前的示例一样。接下来,我们创建了 emitCustomEvent 函数来触发自定义事件。请注意,eventData 是事件数据的占位符,您可以根据需要替换为实际的事件数据。

<template><div><button @click="emitCustomEvent">触发自定义事件</button></div>
</template><script setup>
import { defineEmits } from 'vue';// 使用 defineEmits 定义可触发的自定义事件
const emits = defineEmits(['custom-event-name']);// 创建一个函数来触发自定义事件
const emitCustomEvent = () => {emits('custom-event-name', eventData);
};
</script>
2.2.2.监听自定义事件

我们在父组件的 <template> 部分使用 @custom-event-name(或 v-on:custom-event-name)来监听子组件触发的名为 custom-event-name 的自定义事件。然后,在 <script setup> 部分,我们通过定义 handleCustomEvent 函数来处理自定义事件触发的逻辑。

<template><div><child-component @custom-event-name="handleCustomEvent"></child-component></div>
</template><script setup>
import ChildComponent from './ChildComponent.vue';// 监听子组件触发的自定义事件
const handleCustomEvent = (eventData) => {// 处理自定义事件触发的逻辑console.log('自定义事件触发了,事件数据:', eventData);
};
</script>

 

3.全局事件总线通信

3.1在 Vue 2 中使用全局事件总线

3.1.1.创建全局事件总线

在一个单独的 Vue 实例上添加事件总线,通常在一个单独的文件中。

// EventBus.jsimport Vue from 'vue';
export const EventBus = new Vue();
3.1.2.触发事件

在任何组件中,您可以使用 $emit 方法来触发事件。

// 发送组件
<script>
import { EventBus } from './EventBus.js';export default {methods: {sendData() {EventBus.$emit('custom-event-name', eventData);}}
}
</script>
3.1.3.监听事件

在任何组件中,您可以使用 $emit 方法来触发事件。

// 发送组件
<script>
import { EventBus } from './EventBus.js';export default {methods: {sendData() {EventBus.$emit('custom-event-name', eventData);}}
}
</script>

3.2在Vue3中使用全局事件总线

首先安装第三方插件 mitt(也称为 Micro Event Emitter)来实现事件总线的功能,这对于在 Vue 3 中进行组件通信是一种常见的方法。mitt 是一个轻量级的事件发射器库,可以用于处理事件的触发和监听。

3.2.1安装插件
npm install mitt
3.2.2使用mitt
// EventBus.js
import mitt from 'mitt';// 创建事件总线实例
const emitter = mitt();export default emitter;
3.2.3.触发事件
// 发送组件
<template><button @click="sendData">触发事件</button>
</template><script setup>
import emitter from './EventBus.js';const sendData = () => {emitter.emit('custom-event-name', eventData);
}
</script>
3.2.4.监听事件
// 接收组件
<template><div></div>
</template><script setup>
import emitter from './EventBus.js';emitter.on('custom-event-name', eventData => {// 处理事件数据
});
</script>

我们创建了一个名为 EventBus.js 的文件,其中包含了 mitt 的实例,这个实例被用作事件总线。然后,在发送组件和接收组件中,我们都导入了 EventBus.js 并使用它来触发和监听自定义事件。

 

4.provide与inject通信

4.1在vue2中使用provide与inject通信

在 Vue 2 中,provideinject 是通过父组件向子孙组件传递数据的一种方式。父组件使用 provide 提供数据,然后子孙组件使用 inject 来注入这些数据。

 4.1.2.父组件
<template><div><child-component></child-component></div>
</template><script>
export default {provide: {message: 'Hello from parent!'}
}
</script>
 4.1.2.子组件
<template><div><grandchild-component></grandchild-component></div>
</template><script>
export default {inject: ['message'],mounted() {console.log(this.message); // 输出:Hello from parent!}
}
</script>

4.2在 Vue 3 中使用 provideinject

在 Vue 3 中,provideinject 的使用方式与 Vue 2 类似,但有一些改进,特别是在 TypeScript 和 Composition API 中的使用更方便。

4.2.1.父组件
<template><div><child-component></child-component></div>
</template><script  setup>
import { provide } from 'vue';
provide('message', 'Hello from parent!');
</script>
4.2.1.子组件
<template><div><grandchild-component></grandchild-component></div>
</template><script setup>
import { inject } from 'vue';const message = inject('message');// 使用注入的数据
console.log(message); // 输出:Hello from parent!</script>

Vue 3 的 Composition API 使得在 setup 函数中更容易使用 provideinject。在 setup 中提供的数据会自动反应到子组件中,无需额外的设置。此外,由于 Vue 3 更好地支持 TypeScript,因此类型检查更加准确。

5.Pinia和Vuex

状态管理工具

详细查看一下博客

Piniaicon-default.png?t=N7T8http://t.csdnimg.cn/22mmUVueXicon-default.png?t=N7T8http://t.csdnimg.cn/hvOi4

6.插槽实现通信

Vue 中的插槽(slot)是一种用于在父组件中向子组件传递内容的机制,而不仅仅是数据通信。通过插槽,您可以将任何内容(如文本、HTML、其他组件等)传递给子组件,并在子组件中进行渲染。虽然插槽主要用于渲染内容,但您仍然可以在插槽中包含数据,并且通过插槽的方式进行通信。

6.1在父组件中传递数据给子组件并实现通信

<!-- ParentComponent.vue -->
<template><div><child-component><!-- 通过插槽向子组件传递数据 --><template #custom-slot><p>{{ message }}</p><button @click="sendMessage">发送消息</button></template></child-component></div>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: {ChildComponent},data() {return {message: 'Hello from parent!'};},methods: {sendMessage() {this.message = 'Message sent from parent!';}}
};
</script>

6.2在子组件中接收插槽内容并实现通信

<!-- ChildComponent.vue -->
<template><div><slot name="custom-slot"></slot></div>
</template><script>
export default {// 子组件可以在这里接收插槽内容mounted() {const customSlotContent = this.$slots['custom-slot'];// 监听按钮点击事件并触发通信customSlotContent[1].componentInstance.$on('click', () => {this.$emit('custom-event', 'Message received in child!');});}
};
</script>

父组件 ParentComponent 包含了一个名为 custom-slot 的插槽,其中包含了一个段落元素和一个按钮。父组件通过插槽向子组件 ChildComponent 传递了数据和一个触发通信的按钮。

子组件 ChildComponent 接收了插槽内容,并在其中监听按钮的点击事件。当按钮被点击时,子组件触发了一个自定义事件 custom-event,并将消息作为参数传递给父组件。

相关文章:

Vue组件通信方式

1.props通信 1.1在 Vue 2 中使用 props 通信 注意:props传递的数据是只读的,子组件修改,不会影响父组件 1.1.1.定义 props 在子组件中使用 props 选项来定义要接收的属性 // 子组件 <script> export default {props: {message: String} } </script>1.1.2.传递…...

redis-设置从节点

节点结构 节点配置文件 主节点 不变 6380节点 port 6380 slaveof 127.0.0.1 63796381节点 port 6381 slaveof 127.0.0.1 6380启动 指定配置文件的方式启动 D:\jiqun\redis\Redis-6380>redis-server.exe redis.windows.conf启动时&#xff0c;会触发同步数据命令 主节点…...

k8s-实战——基于nfs实现动态存储

部署nfs服务 基于Centos7.9版本创建动态存储注意k8s版本应低于v1.24版本高k8s版本ServiceAccount需要手动创建secrets并关联相关sa部署流程 创建NFS共享服务、采用单独的节点用于nfs服务独占安装nfs-utils和rpcbindnfs客户端和服务端都安装nfs-utils包通过部署化脚本安装k8s集群…...

【广州华锐互动】鱼类授精繁殖VR虚拟仿真实训系统

随着科技的不断发展&#xff0c;虚拟现实技术在各个领域的应用越来越广泛。在养殖业中&#xff0c;VR技术可以帮助养殖户进行家鱼授精实操演练&#xff0c;提高养殖效率和繁殖成功率。本文将介绍利用VR开展家鱼授精实操演练的方法和应用。 首先&#xff0c;我们需要了解家鱼授精…...

RocketMQ Promethus Exporter

介绍​ Rocketmq-exporter 是用于监控 RocketMQ broker 端和客户端所有相关指标的系统&#xff0c;通过 mqAdmin 从 broker 端获取指标值后封装成 87 个 cache。 警告 过去版本曾是 87 个 concurrentHashMap&#xff0c;由于 Map 不会删除过期指标&#xff0c;所以一旦有 la…...

Kafka收发消息核心参数详解

文章目录 1、从基础的客户端说起1.1、消息发送者主流程1.2、消息消费者主流程 2、从客户端属性来梳理客户端工作机制2.1、消费者分组消费机制 1、从基础的客户端说起 Kafka提供了非常简单的客户端API。只需要引入一个Maven依赖即可&#xff1a; <dependency><groupId…...

Springboot中Aop的使用

Springboot中使用拦截器、过滤器、监听器-CSDN博客 相比较于拦截器&#xff0c;Spring 的aop则功能更强大&#xff0c;封装的更细致&#xff0c;需要单独引用 jar包。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-b…...

创建vue3项目、链式调用、setup函数、ref函数、reactive函数、计算和监听属性、vue3的生命周期、torefs的使用、vue3的setup写法

1 创建vue3项目 # 两种方式- vue-cli&#xff1a;vue脚手架---》创建vue项目---》构建vue项目--》工具链跟之前一样- vite &#xff1a;https://cn.vitejs.dev/-npm create vuelatest // 或者-npm create vitelatest一路选择即可# 运行vue3项目-vue-cli跟之前一样-vite 创建的…...

搭建好自己的PyPi服务器后怎么使用

当您成功搭建好自己的 PyPI 服务器后&#xff0c;您可以使用以下步骤来发布和使用您的包&#xff1a; 打包您的代码&#xff1a; 首先&#xff0c;将您的 Python 项目打包成一个发布包。确保您已经在项目根目录下创建了 setup.py 文件&#xff0c;并按照正确的格式填写了项目信…...

Vue3 中使用provide和reject

1、provide 和reject 可以实现一条事件线上的 父传子&#xff0c;父传孙等&#xff1b;相比较 props emits 仅限与父子传参更方便&#xff0c;相较于pinia书写更简单&#xff0c;但是需要注意使用响应式&#xff0c;如果是非响应式的会导致页面更新不及时 父组件 <templat…...

大数据flink篇之一-基础知识

一、起源 2010至2014年间&#xff0c;由柏林工业大学、柏林洪堡大学和哈索普拉特纳研究所联合发起名Stratosphere的研究项目。2014年4月&#xff0c;项目贡献给Apache基金会&#xff0c;成为孵化项目。更名为Flink2014年12月&#xff0c;成为基金会顶级项目2015年9月&#xff…...

No140.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…...

Oracle 11g_FusionOS_安装文档

同事让安装数据库&#xff0c;查询服务器信息发现操作系统是超聚变根据华为openEuler操作系统更改的自研操作系统&#xff0c;安装过程中踩坑不少&#xff0c;最后在超聚变厂商的技术支持下安装成功&#xff0c;步骤可参数该文。 一、 安装环境准备 1.1 软件下载 下载地址:…...

Linux驱动实现IO模型

在Linux系统分为内核态和用户态&#xff0c;CPU会在这两个状态之间进行切换。当进行IO操作时&#xff0c;应用程序会使用系统调用进入内核态&#xff0c;内核操作系统会准备好数据&#xff0c;把IO设备的数据加载到内核缓冲区。 然后内核操作系统会把内核缓冲区的数据从内核空…...

wsl2 更新报错问题解决记录

1、问题 win10 中安装的 wsl2&#xff0c;启动 docker desktop 时提示 wsl2 有问题&#xff1a; 于是点击推荐的地址连接到微软&#xff0c;下载 wsl2 的更新文件。之后运行&#xff0c;又报错&#xff1a; 更新被卡住。 2、解决方法 WinR 输入 cmd 打开命令行窗口&#x…...

突破算法迷宫:精选50道-算法刷题指南

前言 在计算机科学和编程领域&#xff0c;算法和数据结构是基础的概念&#xff0c;无论你是一名初学者还是有经验的开发者&#xff0c;都需要掌握它们。本文将带你深入了解一系列常见的算法和数据结构问题&#xff0c;包括二分查找、滑动窗口、链表、二叉树、TopK、设计题、动…...

玩转Mysql系列 - 第26篇:聊聊mysql如何实现分布式锁?

这是Mysql系列第26篇。 本篇我们使用mysql实现一个分布式锁。 分布式锁的功能 分布式锁使用者位于不同的机器中&#xff0c;锁获取成功之后&#xff0c;才可以对共享资源进行操作 锁具有重入的功能&#xff1a;即一个使用者可以多次获取某个锁 获取锁有超时的功能&#xff…...

linux 解压缩命令tar

Tar tar 命令的选项有很多(用 man tar 可以查看到)&#xff0c;但常用的就那么几个选项&#xff0c;下面来举例说明一下&#xff1a; tar -cf all.tar *.jpg 这条命令是将所有.jpg 的文件打成一个名为 all.tar 的包。-c 是表示产生新的包&#xff0c;-f 指 定包的文件名。 …...

OpenAI ChatGPT API 文档之 Embedding

译者注&#xff1a; Embedding 直接翻译为嵌入似乎不太恰当&#xff0c;于是问了一下 ChatGPT&#xff0c;它的回复如下&#xff1a; 在自然语言处理和机器学习领域&#xff0c;"embeddings" 是指将单词、短语或文本转换成连续向量空间的过程。这个向量空间通常被称…...

Java常用类(二)

好久不见&#xff0c;因工作原因&#xff0c;好久没发文了&#xff0c;OldWang 回来了&#xff0c;持续更新Java内容&#xff01;⭐ 不可变和可变字符序列使用陷阱⭐ 时间处理相关类⭐ Date 时间类(java.util.Date)⭐ DateFormat 类和 SimpleDateFormat 类⭐ Calendar 日历类 ⭐…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架&#xff0c;该方法利用Stable Diffusion的强大生成能力&#xff0c;仅需单个正常样本和文本描述&#xff0c;即可生成逼真且多样化的异常样本&#xff0c;有效解决了视觉异常检测中异常样本稀缺的难题&#xff0c;为工业质检、医疗影像…...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)

引言 在嵌入式系统中&#xff0c;用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例&#xff0c;介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单&#xff0c;执行相应操作&#xff0c;并提供平滑的滚动动画效果。 本文设计了一个…...

Qt的学习(一)

1.什么是Qt Qt特指用来进行桌面应用开发&#xff08;电脑上写的程序&#xff09;涉及到的一套技术Qt无法开发网页前端&#xff0c;也不能开发移动应用。 客户端开发的重要任务&#xff1a;编写和用户交互的界面。一般来说和用户交互的界面&#xff0c;有两种典型风格&…...