vue基础之组件通信(VUE3)

文章目录

  • 前言
  • 一、父子组件通信
    • 1.父组件向子组件通信
    • 2.子组件向父组件通信
    • 3.ref父组件直接操作子组件通信。
  • 二、跨代通信
    • 1. 跨层级通信
    • 2.事件总线通信
  • 总结


前言

vue3的组件通信和vue2相比在语法上会有些差距,且vue3有的通信方式也在功能上比vue2更加完善,比如provide/inject,vue3相比vue2多了支持响应式的功能。这里主要列出vue3的组件通信,且使用vue3的组合式API风格来实现。


提示:以下是本篇文章正文内容,下面案例可供参考

一、父子组件通信

1.父组件向子组件通信

(1)父组件传递:
只需要在引入的子组件标签上,传入(子组件那里已经定义的)参数名对应的值即可。
语法:
<template><子组件名称 :参数名1="值" :参数名2="值"></子组件名称></template>
(2)子组件接收:
使用props关键字。在vue2(选项式API)中,props直接定义在最外层和data、methods同级,而vue3的组合式api中则需要通过defineProps来定义,
即语法为:(语法糖形式)

const props = defineProps({ 参数名1: 参数类型, 参数名2: 参数类型 });

如果是setup()形式,则和setup()同级,写法和选项式api一致,一般写setup上面:

export default {props: {参数1: 参数值},setup(props) {// setup() 接收 props 作为第一个参数console.log(props.参数1)}
}

当然defineProps中不仅可以传对象也可以传字符串数组,一般是传递对象,因为需要定义参数类型。

使用时语法:props.参数名1

整体示例:
子组件:
ChildComponent.vue

<script setup>
import { ref } from 'vue';const props = defineProps({title: {type: String,default: '默认标题',},btnFun: {type: Function,default: () => {},},
});
const inputValue = ref('');
</script><template><div><h2>{{ props.title }}</h2><a-button type="primary" @click="props.btnFun">完成</a-button><a-input v-model:value="inputValue" placeholder="请输入" /></div>
</template>

父组件:


<template><child-component :title="测试标题" :btn-fun="() => { console.log('按钮被点击'); }"></child-component>
</template>

其中ChildComponent和btnFun可以是原值,也可以是“-”分割后的值,都可以识别。

2.子组件向父组件通信

使用emit,vue3定义emit,使用defineEmits,
子组件里:
定义语法:
const emit = defineEmits(['child-event1','child-event2']);
setup()形式定义位置同1中的defineProps。
触发语法:
emit('child-event1',要传递的参数)
父组件里:
接收语法:
<子组件名 @child-event1='本地定义函数名'/>
整体例子:

<!-- 父组件 -->
<template><ChildComponent :message="parentMsg" @child-event="handleEvent" />
</template><script setup>
import { ref } from 'vue';
const parentMsg = ref('来自父组件的数据');const handleEvent = (payload) => {console.log('子组件传来:', payload);
};
</script><!-- 子组件:ChildComponent -->
<template><button @click="$emit('child-event', '触发事件')">发送数据</button>
</template><script setup>
const props = defineProps({message: String
});
const emit = defineEmits(['child-event']);
</script>

3.ref父组件直接操作子组件通信。

vue3中的语法,父组件:

<template><子组件名称 ref="ref名称"/>
</template><script setup>
import { ref } from 'vue';
const 'ref名称' = ref(null); // 父组件可以通过'ref名称'拿到子组件上的方法和data等数据</script>

示例:

<!-- 父组件 -->
<template><ChildComponent ref="childRef" />
</template><script setup>
import { ref, onMounted } from 'vue';
const childRef = ref(null);onMounted(() => {childRef.value.someMethod(); // 调用子组件方法
});
</script>

进阶:如果是遇到多个子组件按需加载的情况,则此时若要通过ref获取到子组件的信息,则子组件还需加上 defineExpose
场景:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

is里面循环的子组件(StepOne、StepTwo)里需要加上:在这里插入图片描述

二、跨代通信

1. 跨层级通信

使用provide/inject函数, 其中provide为后代组件提供数据,需要接收的后代组件则是通过inject去接收数据。
语法:
祖先组件发送数据:provide('注入名', 要传递的参数);
后代接收数据:inject('注入名',要接收的参数);
使用示例:

<!-- 祖先组件 -->
<script setup>
import { provide, ref } from 'vue';
const theme = ref('dark');
provide('theme', theme); // 提供数据
</script><!-- 深层子组件 -->
<script setup>
import { inject } from 'vue';
const theme = inject('theme'); // 注入数据
console.log(theme.value); // 'dark'
</script>

另:如果没有使用setup语法糖,provide(/inject)要在setup()函数内调用:

import { provide } from 'vue'export default {setup() {provide(/* 注入名 */ 'message', /* 值 */ 'hello!')}
}

进阶:
provide第二个参数,即要传递的参数值可以是任意类型,包括响应式的状态,比如一个 ref;
provide可以传递多个,后代按照注入名字接收,如果有重复的则以离得最近的父代为准。

import { ref, provide } from 'vue'const count = ref(0);
function updateCount() {count ++;
}
provide('key', { count, updateCount });

后代接收时:

<script setup>
import { inject } from 'vue'const { count, updateCount } = inject('location'); 
</script><template><button @click="updateCount">{{ count }}</button>
</template>

2.事件总线通信

使用mitt工具:
下载:npm install mitt
创建事件总线模块:
event-bus.js

import mitt from 'mitt';const emitter = mitt();export default emitter;

发送事件组件:
SenderComponent.vue

<template><button @click="sendMessage">发送消息</button>
</template><script setup>
import emitter from './event-bus';const sendMessage = () => {emitter.emit('custom-event', {message: '来自SenderComponent的消息',timestamp: new Date().toISOString()});
};
</script>

接收事件组件:
ReceiverComponent.vue

<template><div><p>接收到的消息: {{ receivedMessage }}</p></div>
</template><script setup>
import { ref, onMounted, onUnmounted } from 'vue';
import emitter from './event-bus';const receivedMessage = ref('等待消息...');const handleEvent = (payload) => {receivedMessage.value = payload.message;console.log('接收到事件:', payload);
};onMounted(() => {// 注册事件监听emitter.on('custom-event', handleEvent);
});onUnmounted(() => {// 移除事件监听,防止内存泄漏emitter.off('custom-event', handleEvent);
});
</script>

总结

以上用了大概五种方式来阐述组件之间的通信,这些在日常开发中比较常见,对于vue入门来说是需要去掌握并灵活运用的,对于子父组件一开始会有混乱不清的情况,这种在以后的练习和熟悉中会逐渐分清。

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

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

相关文章

【RidgeUI AI+系列】中文重复统计器

中文重复统计器 文字重复统计是一个使用文本处理工具&#xff0c; 输入文本内容并指定最小词长度后&#xff0c; 就能自动高亮显示重复的词。 本教程将会借助AI实现这个应用的开发 页面脚本编写 该工具的基础流程较为清晰&#xff1a;用户输入一段文字后&#xff0c;调用提取…

代码随想录|图论|05岛屿数量(深搜DFS)

leetcode:99. 岛屿数量 题目 题目描述&#xff1a; 给定一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的矩阵&#xff0c;你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成&#xff0c;并且四周都是水域。你可以假设矩阵外均…

数据结构-第二节-堆栈与队列

一、概念&#xff1a; 堆栈与队列也是线性表&#xff0c;但是&#xff1a; 堆栈&#xff1a;只能在一个端进行插入删除&#xff0c;此端称为栈顶。&#xff08;特点&#xff1a;后来居上&#xff09; 队列&#xff1a;在一端进行插入&#xff08;队尾&#xff09;&#xff0…

HarmonyNext动画大全02-显式动画

HarmonyOS NEXT显式动画详解 1. 核心接口 显式动画通过animateTo接口实现&#xff0c;主要特点包括&#xff1a; 触发方式&#xff1a;需主动调用接口触发动画 参数配置 &#xff1a; animateTo({duration: 1000, // 动画时长(ms)curve: Curve.Ease, // 动画曲线delay: 200…

芯谷科技--高压降压型 DC-DC 转换器D7005

在当今电子设备日益复杂且对电源性能要求极高的背景下&#xff0c;一款高效、稳定的电源管理芯片至关重要。 D7005凭借其卓越的性能和广泛的应用适配性&#xff0c;成为众多工程师在设计电源方案时的优选。 产品简介 D7005 是一款高效、高压降压型 DC-DC 转换器&#xff0c;具…

MySQL的GTID详解

GTID&#xff08;Global Transaction Identifier&#xff0c;全局事务标识符&#xff09;是MySQL 5.6及以上版本引入的重要特性&#xff0c;用于在主从复制环境中唯一标识每个事务&#xff0c;简化复制管理、故障转移和数据一致性维护。以下从多维度详细介绍GTID&#xff1a; …

专题:2025中国游戏科技发展研究报告|附130+份报告PDF、原数据表汇总下载

原文链接&#xff1a;https://tecdat.cn/?p42756 本报告汇总解读基于艾瑞咨询《2025中国游戏科技发展白皮书》、伽马数据《2025年1-3月中国游戏产业季度报告》、嘉世咨询《2025中国单机游戏市场现状报告》等多份行业研报数据。当《黑神话&#xff1a;悟空》以虚幻引擎5复刻东…

【数据挖掘】数据挖掘综合案例—银行精准营销

要求&#xff1a; 1、根据相关的信息预测通过电话推销&#xff0c;用户是否会在银行进行存款 2、数据bank.csv&#xff0c;约4520条数据&#xff0c;17个属性值 提示&#xff1a; 17个属性&#xff0c;分别是年龄&#xff0c;工作类型&#xff0c;婚姻状况&#xff0c;受教育…

postgresql查看锁的sql语句

发现一个查看postgresql锁比较好的sql语句&#xff0c;参考链接地址如下 链接地址 查看锁等待sql witht_wait as(select a.mode,a.locktype,a.database,a.relation,a.page,a.tuple,a.classid,a.granted,a.objid,a.objsubid,a.pid,a.virtualtransaction,a.virtualxid,a.trans…

JSON 格式详解

JSON 格式详解 随着互联网的发展和各种 Web 应用程序的普及&#xff0c;数据交换已经成为了我们日常开发中的重要环节。而在各种数据交换格式中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;作为一种轻量级的数据交换格式&#xff0c;以其简洁、易于阅…

原型设计Axure RP网盘资源下载与安装教程共享

对于初学者来说&#xff0c;我们熟悉一下其定义&#xff1a;‌Axure RP是一款常用的快速原型设计工具‌&#xff0c;主要用于创建应用软件或Web网站的线框图、流程图、原型和规格说明文档&#xff0c;广泛应用于产品经理、UI/UX设计师等专业领域。‌‌ 主要用户群体&#xff1…

iframe嵌套 redirect中转页面 route跳转

需求是项目A要使用iframe内嵌项目B的页面&#xff0c; 由于需要嵌套的页面很多&#xff0c;每个页面路径和参数又各不相同&#xff0c; 所以我们在项目B里做了一个中转页面&#xff0c;这样就能自己掌控项目A传递过来的东西了&#xff1b; routes.js 增加一个菜单&#xff1a;…

IP数据报 封装成 MAC帧 ( 目的MAC地址6B 源MAC地址6B 类型2B 数据部分 FCS校验和4B )

将 IP 数据报&#xff08;Internet Protocol Datagram&#xff09;封装成 MAC 帧 需要在数据链路层添加适当的头部信息&#xff0c;以便在局域网内进行传输。这个过程涉及将网络层&#xff08;IP 层&#xff09;的数据通过数据链路层&#xff08;MAC 层&#xff09;封装成适合物…

Note2.4 机器学习:Batch Normalization Introduction

Batch Normalization&#xff08;批标准化&#xff0c;BN&#xff09;通过标准化数据的操作&#xff0c;使得损失函数的优化地形&#xff08;optimization landscape&#xff09;更加平滑&#xff0c;从而达到更好地训练效果。BN常用于卷积神经网络&#xff08;CNN&#xff09;…

IDEA在AI时代的智能编程实践:从工蜂到通义灵码的效能跃迁‌‌

引言‌ 在腾讯云工作期间&#xff0c;我曾使用‌工蜂的AI代码补全功能&#xff0c;结合IntelliJ IDEA&#xff08;以下简称IDEA&#xff09;极大提升了开发效率。如今离开腾讯云&#xff0c;面对外部开发环境&#xff0c;如何继续利用AI提升编码效率&#xff1f;本文将系统梳理…

MySQL 慢查询日志详解

慢查询日志&#xff08;Slow Query Log&#xff09;是 MySQL 提供的一种核心性能优化工具&#xff0c;用于记录执行时间超过指定阈值的 SQL 语句。通过分析这些日志&#xff0c;可以定位数据库性能瓶颈&#xff0c;优化低效查询&#xff0c;提升系统整体效率。 一、慢查询日志的…

UV安装Python指南总结

UV安装Python指南总结 UV是一个Python包管理工具,它可以帮助我们安装和管理Python版本。以下是关于UV安装Python的主要功能和用法总结。 基本使用 安装最新版Python uv python install注意&#xff1a;UV使用Astral的python-build-standalone项目提供的Python发行版,而不是…

运维基础-MYSQL数据库-笔记

序 欠10年前自己的一份笔记&#xff0c;献给今后的自己。 数据库介绍 数据的时代 涉及的数据量大数据不随程序的结束而消失数据被多个应用程序共享大数据 数据库的发展史 萌芽阶段&#xff1a;文件系统 使用磁盘文件来存储数据初级阶段&#xff1a;第一代数据库 出现了网状…

从GPTs到Real智能体:目前常见的几种创建智能体方式

文章目录 智能体的三个发展阶段低阶智能体(面向过程) VS 高阶智能体(面向目标)主流智能体创建平台实践基础型平台cherry-studio豆包讯飞星火腾讯元器 高阶智能体开发体系cline开发套件Coze平台Dify开源框架Manus突破性方案 技术演进趋势总结 智能体的三个发展阶段 当前智能体技…

WPF 实现自定义数字输入弹窗

1.前端代码实现 <Grid><Grid.RowDefinitions><RowDefinition Height"100" /><RowDefinition Height"*" /></Grid.RowDefinitions><BorderGrid.Row"0"BorderBrush"WhiteSmoke"BorderThickness"0…