Vue中的组件通信

父向子通信

1.定义props

子组件中,定义期望接收的属性。例如,在子组件的script部分:

export default {props: {message: String // 假设父组件要传递一个字符串类型的数据}
}

2.传递数据

在父组件的模板中,通过属性绑定的方式将数据传递给子组件。

<template><ChildComponent :message="parentMessage" />
</template>

 这里parentMessage是父组件的数据属性,:message是将该数据绑定到子组件的message prop上。

子向父通信

1.触发事件

在子组件中,当需要通知父组件时,可以使用this.$emit触发一个自定义事件,并可附带参数。

methods: {sendDataToParent() {this.$emit('child-event', { someData: 'Hello from child!' });}
}

2.监听事件

在父组件的模板中,使用v-on或简写@来监听子组件触发的事件,并定义处理函数。

<template><ChildComponent @child-event="handleChildEvent" />
</template><script>
export default {methods: {handleChildEvent(childData) {console.log('Received data from child:', childData);}}
}
</script>

当子组件触发child-event时,父组件的handleChildEvent方法会被调用,并接收到子组件传递的数据

通过v-model简化代码

通过v-model,父组件可以直接绑定一个变量到子组件的输入值,而不需要显式地定义事件监听器或处理函数来更新数据。子组件通过监听内部的变动并发出input事件,维持了这种双向绑定关系.

//父组件
<template><div><base-select v-model="selectedCity"></base-select></div>
</template><script>
import BaseSelect from './BaseSelect.vue';export default {components: {BaseSelect},data() {return {selectedCity: '' // 这个变量将与BaseSelect组件的选择值双向绑定};}
};
</script>
//子组件
<template><select :value="value" @change="handleChange"><!-- 选项列表 --></select>
</template><script>
export default {props: {value: String // 用来接收v-model绑定的值},methods: {handleChange(e) {this.$emit('input', e.target.value); // 当下拉选项变化时,触发input事件并传递新值}}
};
</script>

注意

  • 单向数据流: Vue推荐数据流动主要遵循单向数据流原则,即数据从父组件流向子组件,通过事件回调进行反向通信,保持数据流向的清晰。
  • 避免直接修改Props: 子组件不应该直接修改接收到的props,如果需要修改数据,应该通过触发事件让父组件去处理。如果确实需要局部状态,可以使用子组件的本地数据。

事件总线 

1.创建Event Bus实例

创建一个Vue实例作为事件总线。这个实例并不用于渲染任何内容,而是纯粹作为事件的中心枢纽

import Vue from 'vue';
export const EventBus = new Vue();

2.发送事件(发布)

在发送事件的组件中,使用EventBus.$emit方法触发一个事件,并可以传递数据。

// 在某个组件中
import { EventBus } from './eventBus.js';methods: {sendMessage() {EventBus.$emit('messageSent', { text: 'Hello from sender!' });}
}

3.监听事件(订阅)

需要接收事件的组件中,使用EventBus.$on方法监听特定事件。

// 在另一个组件中
import { EventBus } from './eventBus.js';mounted() {EventBus.$on('messageSent', this.receiveMessage);
},
beforeDestroy() {// 为了避免内存泄漏,记得在组件销毁前移除事件监听器EventBus.$off('messageSent', this.receiveMessage);
},
methods: {receiveMessage(payload) {console.log('Received message:', payload.text);}
}

注意

  • 内存泄漏:由于事件监听器可能长期存在,务必在组件卸载时使用EventBus.$off移除不再需要的监听器,以防止内存泄漏。
  • 代码可维护性:随着应用复杂度增加,过度依赖Event Bus可能导致代码难以理解和维护。对于大型应用,可能需要转向使用Vuex这样的状态管理库来更系统地管理状态和事件。
  • 替代方案:Vue 3引入了Composition API,可以通过创建自定义组合API或使用第三方库如pinia来实现更灵活的状态管理和跨组件通信,减少对Event Bus的依赖。

祖先向后代通信

1.在祖先组件中使用 provide

祖先组件中使用 provide 来提供数据或方法。provide 接收一个对象或返回对象的函数,这个对象的属性将被注入到后代组件中。

// AncestorComponent.vue
export default {provide() {return {message: 'Hello from ancestor',someMethod() {console.log('This method is provided by ancestor.');}};}
};

2. 在后代组件中使用 inject

后代组件使用 inject 来接收这些提供的数据或方法。可以直接注入具体的键名,或者提供一个对象来配置注入行为。

// DescendantComponent.vue
export default {inject: ['message', 'someMethod'],created() {console.log(this.message); // 输出: Hello from ancestorthis.someMethod(); // 输出: This method is provided by ancestor.}
};

或者使用对象形式进行更详细的配置:

export default {inject: {message: { from: 'message' }, // "from" 指定了要注入的属性名anotherNameForSomeMethod: { from: 'someMethod' } // 甚至可以重命名注入的属性},created() {console.log(this.message); this.anotherNameForSomeMethod(); }
};

 注意

  • 层级限制provide 和 inject 只能在组件树的后代中生效,不能跳过中间层获取数据。
  • 适用场景:这种方式适用于那些深层次嵌套或不确定层次关系的组件间通信,比如主题切换、全局配置等。
  • 替代方案:对于复杂的应用,考虑使用 Vuex 状态管理模式,它能更高效、清晰地管理全局状态。

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

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

相关文章

分享: 动图网站

Stickers for iOS & Android | GIPHY 这个网站有一些外国的制作的动图

OOP面试问题 - C#

文章概述 背景问题答案概括 背景 以下是最流行的 OOP面试问题和答案的列表。这些 OOPS 面试问题适用于初学者和专业 C# 开发人员。 问题 什么是对象&#xff1f;什么是封装&#xff1f;什么是抽象&#xff1f;什么是继承&#xff1f;哪些是访问说明符&#xff1f;如何在 C…

PHP实现一个简单的接口签名方法以及思路分析

文章目录 签名生成说明签名生成示例代码签名校验示例代码 签名生成说明 B项目需要调用A项目的接口&#xff0c;由A项目为B项目分配 AccessKey 和 SecretKey&#xff0c;用于接口加密&#xff0c;确保不易被穷举&#xff0c;生成算法不易被猜测。 最终需要确保包含签名的参数只…

2 程序的灵魂—算法-2.4 怎样表示一个算法-2.4.6 用计算机语言表示算法

我们的任务是用计算机解题&#xff0c;就是用计算机实现算法&#xff1b; 用计算机语言表示算法必须严格遵循所用语言的语法规则。 【例 2.20】求 12345 用 C 语言表示。 main() {int i,t; t1; i2; while(i<5) {tt*i; ii1; } printf(“%d”,t); } 【例 2.21】求级数的…

12_1 Linux Yum进阶与DNS服务

12_1 Linux Yum进阶与DNS服务 文章目录 12_1 Linux Yum进阶与DNS服务[toc]1. Yum进阶1.1 自定义yum仓库1.2 网络Yum仓库 2. DNS服务2.1 为什么要使用DNS系统2.2 DNS服务器的功能2.3 DNS服务器分类2.4 DNS服务使用的软件及配置2.5 搭建DNS服务示例2.6 DNS特殊解析 1. Yum进阶 1…

32-读取Excel数据(xlrd)

本篇介绍如何使在python中读取excel数据。 一、环境准备 先安装xlrd模块&#xff0c;打开cmd&#xff0c;输入 pip install xlrd 在线安装。 二、基本操作 import xlrd# 打开excel表格 data xlrd.open_workbook(test.xlsx)# 2.获取sheet表格 # 方式一&#xff1a;通过索引顺…

RocketMq详解:二、SpringBoot集成RocketMq

在上一章中我们对Rocket的基础知识、特性以及四大核心组件进行了详细的介绍&#xff0c;本章带着大家一起去在项目中具体的进行应用&#xff0c;并设计将其作为一个工具包只提供消息的分发服务和业务模块进行解耦 在进行本章的学习之前&#xff0c;需要确保你的可以正常启动和…

【算法篇】滑动窗口的最大值JavaScript版

滑动窗口的最大值 题目描述&#xff1a; 给定一个长度为 n 的数组 num 和滑动窗口的大小 size &#xff0c;找出所有滑动窗口里数值的最大值。 例如&#xff0c;如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3&#xff0c;那么一共存在6个滑动窗口&#xff0c;他们的最大值…

Linux Kernel入门到精通系列讲解(RV-Kernel 篇) 5.4 添加GPU和Framebuffer显示设备

1. 概述 上一章节我们已经成功的移植完busybox,到此,我们已经把我们Naruto-Pi的基本功能全部实现了,接下来,我们会不断探索,引入一些高级驱动,哇咔咔,真厉害,本章节比较简单,我们使用之前我们的8组virtio,我们就用其中一组模拟GPU,由于GPU我没深入了解过,所以我们…

[FFmpeg学习]初级的SDL播放mp4测试

在之前的学习中&#xff0c;通过AVFrame来保存为图片来认识了AVFrame&#xff0c; [FFmpeg学习]从视频中获取图片_ffmpeg 获取图片-CSDN博客 在获取到AVFrame时&#xff0c;还可以调用SDL方法来进行展现&#xff0c;实现播放效果。 参考资料 SDL&#xff0c;ffmpeg实现简单…

MySQL中的数据库约束

目录 导读&#xff1a; 约束类型 1、not null&#xff08;不能为空&#xff09; 2、unique(唯一) 3、default(默认值约束) 4、primary key(唯一)与unique 相同点&#xff1a; 不同点&#xff1a; auto_increment&#xff1a; 5、foreign key(外键) 语法形式&#xff…

康姿百德集团公司官网床垫价格透明,品质睡眠触手可及

选择康姿百德床垫&#xff0c;价格透明品质靠谱&#xff0c;让你拥有美梦连连 在当今社会&#xff0c;良好的睡眠质量被越来越多的人所重视。睡眠不仅关系到我们第二天的精力状态&#xff0c;更长远地影响着我们的身体健康。因此&#xff0c;选择一款合适的床垫对于获得优质睡…

损失函数(Loss Function)

损失函数&#xff08;Loss Function&#xff09;是机器学习领域中一个至关重要的概念&#xff0c;用于衡量模型预测结果与真实结果之间的误差程度。 一、定义 损失函数或代价函数是将随机事件或其相关随机变量的取值映射为非负实数的函数&#xff0c;以表示该随机事件的“风险…

antdv 穿梭框

antd的穿梭框的数据貌似只接收key和title&#xff0c;而且必须是字符串&#xff08;我测试不是字符串的不行&#xff09;&#xff0c; 所以要把后端返回的数据再处理一下得到我们想要的数据 除了实现简单的穿梭框功能&#xff0c;还想要重写搜索事件&#xff0c;想达到的效果是…

FastAPI:在大模型中使用fastapi对外提供接口

通过本文你可以了解到&#xff1a; 如何安装fastapi&#xff0c;快速接入如何让大模型对外提供API接口 往期文章回顾&#xff1a; 1.大模型学习资料整理&#xff1a;大模型学习资料整理&#xff1a;如何从0到1学习大模型&#xff0c;搭建个人或企业RAG系统&#xff0c;如何评估…

LibreOJ #10131. 「一本通 4.4 例 2」暗的连锁 题解 树上差分

暗的连锁 题目描述 Dark 是一张无向图&#xff0c;图中有 N 个节点和两类边&#xff0c;一类边被称为主要边&#xff0c;而另一类被称为附加边。Dark 有 N−1 条主要边&#xff0c;并且 Dark 的任意两个节点之间都存在一条只由主要边构成的路径。另外&#xff0c;Dark 还有 M…

解决!word转pdf时,怎样保持图片不失真

#今天用word写了期末设计报告&#xff0c;里面有很多过程的截图&#xff0c;要打印出来&#xff0c;想到pdf图片不会错位&#xff0c;就转成了pdf&#xff0c;发现图片都成高糊了&#xff0c;找了好多方法&#xff0c;再不下载其他软件和插件的情况下&#xff0c;导出拥有清晰的…

BarTender 常见的使用要点

BarTender 简述 BarTender是由美国海鸥科技&#xff08;Seagull Scientific&#xff09;推出的一款条码打印软件&#xff0c;被广泛应用于标签、条形码、证卡和RFID标记的设计和打印领域。它在全球范围内拥有众多用户&#xff0c;被公认为标签打印方面的全球领先者。BarTender…

JavaScript基础用法(变量定义、输入输出、转义符、注释和编码规范)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

conda实现根据序号创建、删除或激活虚拟环境(实用脚本)

不知道用过conda的朋友,你们是否有这样一个困扰,在创建和删除与切换虚拟环境的时候,总感觉很麻烦,有时候,命令又记不住,有没有一个简单的方法,来简化我们的操作,比如通过一个脚本帮我实现,进行控制台交互,就可以轻松实现,conda的创建,激活与删除操作,而不需要记住…