vue之非父子组件通信实现方式

news2024/11/22 22:08:50

在开发中,我们构建了组件树之后,除了父子组件之间的通信之外,还会有非父子组件之间的通信。这里主要讲两种方式:

 

 

  1. Provide/Inject
  2. Mitt全局事件总线

1、Provide和Inject

应用场景

比如有一些深度嵌套的组件,子组件想要获取父组件的部分内容在这种情况下,如果我们仍然将props沿着组件链逐级传递下去,就会非常的麻烦。

对于这种情况下,我们可以使用 Provide和Inject,它可以实现非父子组件之间共享数据

特点

  • 无论层级结构有多深,父组件都可以作为其所有子组件(包括子孙)的依赖提供者
  • 父组件有一个provide选项来提供数据。
  • 子组件有一 inject 选项来使用数据。
实际上,你可以将依赖注入看作是“ long range props”(作用域绵长的props)
父组件不需要知道哪些子组件使用它 provide 的 property;子组件不需要知道 inject 的 property 来自哪里。一般用的不多,提供一些主题、样式之类的。

基本使用

我们编写如下一个组件结构:

 

 

注:不能在定义provide属性的当前组件使用provide提供的数据,兄弟组件也不行。

踩坑

上图中的this指向谁?能不能访问到data里names的长度?为什么?

tips:在这script标签包裹的一段export代码属于一个模块作用域,此时this为undefined。

解决方法是改写provide为函数形式并返回一个对象(像组件里data一样)。

处理响应式数据 

另外如果我们修改了this.names的内容,那么使用length的子组件会不会也发生相应的改变呢?

答案是否定的,因为length不是响应式数据(类似值拷贝)。 所以我们可以使用一些响应式的一些API来完成这些功能,比如说computed函数(vue3语法)。

注:因为 computed返回的是一个ref对象 ,需要手动通过.value形式获取其中真正的值

全局事件总线

Vue3从实例中移除了 $on、$off 和 $once 方法,所以如果希望继续使用全局事件总线,要通过第三方的库。Vue3官方有推荐一些库,例如 mitt 或 tiny-emitter 这里主要介绍一下 mitt库 的使用;

安装

npm install mitt

基本使用

封装一个工具类 eventbus.js:
import mitt from 'mitt';

const emitter = mitt();
// 可以创建多个
// export const emitter1 = mitt();
// export const emitter2 = mitt();
// export const emitter3 = mitt();

export default emitter;
在Home.vue中监听事件

 

在App.vue中触发事件

个人感觉这个api和socket很相像。

关闭监听

在某些情况下我们可能希望 取消掉之前注册的函数监听。

 

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

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

相关文章

SVG 在前端的7种使用方法,你还知道哪几种?

本文简介 点赞 关注 收藏 学会了 技术一直在演变,在网页中使用 SVG 的方法也层出不穷。每个时期都有对应的最优解。 所以我打算把我知道的 7种 SVG 的使用方法列举出来,有备无患~ 如果你还知道其他方法,可以在评论区补充~ 1. 在浏览器直…

PMO(项目管理办公室)的未来趋势

PMO(项目管理办公室)是在组织内部将实践、过程、运作形式化和标准化的部门,也是提高组织管理成熟度的核心部门。现在,让我们把目光投向当前PMO的典型职责之外,思考一下:PMO的未来是什么? 如今&a…

Java:进一步理解多态性

Java:进一步理解多态性 每博一文案 有人说我心里有事,但我谁也不想说,沉默不是没有情绪,而是我明白了,说了又没有意义, 比起诉说的委屈和不甘,沉默或许更好。当我们经历越多真实与虚假&#xf…

Docker安装(centos 7)

安装 以在centos安装为例,主要有以下几个步骤 1、确定你是CentOS7及以上版本 2、卸载旧版本 3、yum安装gcc相关 yum -y install gccyum -y install gcc-c 4、安装需要的软件包 执行如下命令 yum -y install gcc-c 5、设置stable镜像仓库 由于docker外网镜像…

Docker安装canal-admin以及canal-server

一、安装canal-admin可视化管理工具 此处的数据库已经进行了相应的配置,望周知 docker run -it --name canal-admin \ -e spring.datasource.addressxxx:3306 \ -e spring.datasource.databasecanal_manager \ -e spring.datasource.usernameroot \ -e spring.da…

minicom发送AT指令

参考:使用minicom发AT指令,和外设传感器通信 地址:https://blog.csdn.net/hannibaychty/article/details/125463268 目录1、Linux minicom 和 windows串口调试助手的区别2、使用的基本流程3、使用 minicom 需要注意的几点ARM板子外接传感器&a…

从国企到进大厂,全靠阿里、腾讯内网22版Java核心手册合集

记得19年初的时候,我通过一整天的笔试及面试加入一家(某一线城市国资委全资控股)某集团的研究机构(中央研究院),任职高级软件工程师(中级职称);在这边工作了整整一年,目前已经跳槽到一家互联网公司,在回头看看这一整年&#xff0c…

SAP如何删除一个已经释放的请求 (SE38 : RDDIT076)

原文链接:https://zhuanlan.zhihu.com/p/425479956 当你搜到这个文章的时候,说明你做了羞羞的事情哦~(或者正在准备做羞羞的事情)。 此处声明:本帖仅进行可操作性和纯技术讨论,由此造成的一切后…

MMSegmentation使用记录

一、官网下载文件: 当前最新版本为1.0.0rc2 https://github.com/open-mmlab/mmsegmentation/releases/tag/v1.0.0rc2 下载源码解压文件可得到最新版的代码 二、配置环境: 这部分省略:按照给的README文件很快就配置好了 https://github.…

Vuetify中的v-pagination如何实现分页

大家好,我是雄雄。 前言 昨天在改一个系统的时候遇到了个技能点,观察解决了好久,终于解决了,趁热打铁,今天来记录一下。 这个系统是个个人博客,目前我也在使用,但是有个地方用的很不舒服。就是…

32 CPP多态

注意: 1 只需要在基类的函数声明中加上virtual关键字,函数定义时不能加; 2 在派生类中重定义虚函数时,函数特征要相同; 3 当在基类中定义了虚函数时,如果派生类没有重定义该函数,那么将使用基类的虚函数…

设计模式原则 - 接口隔离原则(二)

接口隔离原则一 官方定义二 案例演示普通方案案例分析解决方案解决方案案例总结三 与单一职责原则对比一 官方定义 接口隔离原则(Interface Segregation Principle),又称为ISP原则,官方定义为: Clients should not be…

docker安装seata单节点的详细教程

一、环境部署 1、在自己的数据库新建seata数据库 2、利用seata官方提供的seata数据库sql脚本创建所需数据库seata以及表,脚本地址如下: seata/mysql.sql at 1.4.1 seata/seata GitHub 3、查看docker官方镜像仓库版本 4、拉取seata安装镜像 docker…

【机器学习实战】基于代价敏感学习的AdaCost方法用于信用卡欺诈检测

1. 数据集 数据集地址:Credit Card Fraud Detection 数据集整体浏览: 284807个样本,30个特征,1个分类标签Class Class为0的是多数类,一共有284315个样本。 Class为1的是少数类,一共有492个样本&#xff…

写给Python社群的第11课:Python线程,进程,协程,3个毫无关系的兄弟

文章目录⛳️ 线程、进程与协程🔥 进程与线程简介⛳️ Python 多线程模块🔥 threading 模块🔥 threading 模块实践⛳️ Python 并发进程模块🔥 Process 创建多进程⛳️ 线程、进程与协程 线程、进程、协程 这三个名称相似的概念&…

大话设计模型 Task03:工厂、制造、观察

目录一、建造者模式问题描述问题分析模式定义代码实现二、观察者模式问题描述问题分析模式定义代码实现一、建造者模式 问题描述 我的要求是你用程序画一个小人,这在游戏程序里非常常见,现在简单一点,要求是小人要有头、身体、两手、两脚就可…

左偏树原理详解

一 点睛 左偏树(leftist tree 或 leftist heap)也叫作左偏堆、左倾堆、左式堆,是计算机科学中的一种树,也是一种优先队列实现方式,属于可并堆,在信息学中十分常见,在统计、最值、模拟、贪心等类…

Win11安装WSL2和Nvidia驱动(2022-12-19)

文章目录前言系统环境WSL 1和WSL 2功能对比安装WSL2更新和升级包配置VSCode配置GPU加速安装Nvidia驱动安装Cuda Toolkit通过PyTorch安装CUDA Toolkit测试Nvcc参考链接前言 以前捣鼓过wsl,即Windows下的Linux子系统,但兼容性依然比不过原生的Linux系统&a…

【Linux】进程间通信之管道

目录🌈前言🌸1、IPC介绍🍢1.1、进程间通信的目的🍡1.2、背景和发展🍠1.3、进程间通信的分类🌷2、管道🍡2.1、概念🍢2.2、管道的原理🍣2.3、匿名管道🍤2.4、管…

DOM算法系列004-判断给定节点是否为body元素

UID: 20221218221939 aliases: tags: source: cssclass: created: 2022-12-18 如果我们要判定给定的一个节点是不是页面body与元素节点,该如何判断呢? 一般来说, 一个HTML页面内只有一个body元素 但是,如果我们非要在页面内写超过…