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

React第十一节 组件之间通讯之发布订阅模式(自定义发布订阅器)

组件之间通讯常用方案
1、通过props
2、通过context
3、通过发布订阅模式
4、通过Redux 后面会有专栏介绍

什么情况下使用发布订阅模式

a、当我们想要兄弟组件之间通讯,而共同的父组件中又用不到这些数据时候;
b、当多个毫无相关的组件之间想要进行数据的传递时候,我们可以使用这种模式,当然可以使用 Redux 进行状态管理
c、当我们使用的是通用型组件,组件中只有通用功能,而不用关注各个组件之间的业务代码逻辑时候;

什么是发布订阅模式?

发布订阅模式(也称观察者模式)是一种管理跨组件通讯的方案,特别是在不想直接依赖于特定组件的时候。这种模式允许一个对象(发布者)通知多个其他对象(订阅者),而不必知道这些对象是谁或他们在哪里。
这种方案有助于组件之间解耦,可以提高代码模块化和可维护性。

1、自定义发布订阅类

利用类自身的特性,写通用的订阅事件、发布事件、取消订阅事件

// myComPubsuh 文件import { Component } from "react";export default class MyComPubsuh extends Component {constructor(props) {super(props);this.events = {}}subscribe(event, callback) {// 添加订阅事件if (!this.events[event]) {this.events[event] = []}this.events[event].push(callback)}unsubscribe(event, callback) {// 卸载订阅事件if (this.events[event])  {this.events[event] = this.events[event].filter(cb => cb !== callback)}}pubilsh(event, data) {// 发布事件并执行订阅事件的回调函数if (this.events[event])  {this.events[event].forEach(callback => callback(data));}}
}export  const myPubsh = new MyComPubsuh()

2、子组件A发布消息事件

使用 myPubsh 中的 publish 方法进行消息的发布;

// ChildA 文件
import {useState} from 'react'
import { myPubsh } from './myComPubsuh'
export default function ChildA() {const [message, setMessage] = useState('躺平')// 通过按钮发布消息const handlePubilsh = () => {myPubsh.pubilsh('onabortMessage', message)}const handleInputChange = (e) => {setMessage(e.target.value)// 通过input 自身change 事件触发发布消息// 调用 发布订阅类中的 pubilsh 方法myPubsh.pubilsh('onabortMessage', message)}return (<div><h3>组件A</h3><p>发布消息:{message}</p><input type="text" value={message} onChange={handleInputChange} /><button onClick={handlePubilsh}>发布</button></div>)
}

3、子组件B订阅发布的消息

利用useEffect() Hook 自身的特性,

二个参数为空时候:
a、渲染完成时候,会加载执行一次;
b、组件中任何属性更新时候,都会执行一次;

内部有return 函数,代表组件卸载时候会执行;

// ChildB 组件
import { useEffect, useState } from 'react'
import { myPubsh } from './myComPubsuh'
export default function ChildB() {const [message, setMessage] = useState('')// 利用useEffect() hookuseEffect(() => {const onHandleMsg = (data) => {setMessage(data)}// 订阅 消息myPubsh.subscribe('onabortMessage', onHandleMsg)return () => {// 回调函数执行卸载myPubsh.unsubscribe('onabortMessage', onHandleMsg)}}, [])return (<div><h3>组件B</h3><p>订阅,组件A发布的信息</p><p>{message}</p></div>)
}

4、父组件中 调用两个 子组件

import ChildA from './childA'
import ChildB from './childB'
export default function index() {return (<><ChildA></ChildA><hr /><ChildB></ChildB></>)
}

如图效果:

这种发布订阅模式,可以在任意组件中使用,不会局限于兄弟组件,父子组件,祖孙组件,多层级组件都可以实现应用;
优点
a、组件之间解耦,组件之间不需要彼此引用,可以通过定义的发布订阅类进行通讯;
b、简化状态管理,组件只需要关注自己本身的业务,其他事件由发布订阅类进行处理;
c、异步通信:发布-订阅模式通常支持异步消息传递,这可以提高系统的响应性和效率
d、灵活性:订阅者可以根据自己的需求选择订阅或取消订阅某个主题或频道。
e、扩展性:由于发布者和订阅者是解耦的,所以可以容易地增加更多的发布者或订阅者,而不需要对现有系统进行大的修改。
缺点
a、内存泄漏,使用的发布订阅方法,在组件卸载时候,没有进行注销,会导致事件越来越多;
b、状态跟踪不清晰,复杂的业务场景下,难以追踪状态的变更;
c、复杂性:随着订阅者数量的增加,管理和维护订阅关系可能会变得复杂。
d、安全性:由于发布者不直接与订阅者交互,所以可能需要额外的机制来确保消息的安全性和完整性
e、消息积压和延迟:如果订阅者无法及时处理收到的消息,可能会导致消息在某处积压,从而引发延迟或其他相关问题。

qiong yao qushi

相关文章:

React第十一节 组件之间通讯之发布订阅模式(自定义发布订阅器)

组件之间通讯常用方案 1、通过props 2、通过context 3、通过发布订阅模式 4、通过Redux 后面会有专栏介绍 什么情况下使用发布订阅模式 a、当我们想要兄弟组件之间通讯&#xff0c;而共同的父组件中又用不到这些数据时候&#xff1b; b、当多个毫无相关的组件之间想要进行数据…...

tcpreplay/tcpdump-重放网络流量/捕获、过滤和分析数据包

tcpdump 是一个网络数据包分析工具&#xff0c;通过捕获并显示网络接口上传输的数据包&#xff0c;帮助用户分析网络流量。 原理&#xff1a;用户态通过 libpcap 库控制数据包捕获&#xff0c;内核态通过网卡驱动获取数据包。 核心功能包括&#xff1a;捕获、过滤和分析数据包…...

ASPICE评估体系概览:对象、范围与参考标准解析

ASPICE&#xff08;汽车软件过程改进和能力确定&#xff09;是一个框架&#xff0c;它被广泛应用于汽车行业的软件开发和维护过程的改进。 它类似于软件工程领域的CMMI&#xff08;能力成熟度模型集成&#xff09;&#xff0c;但专门针对汽车行业&#xff0c;考虑了该行业特有…...

力扣92.反转链表Ⅱ

题目描述 题目链接92. 反转链表 II 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left …...

Java设计模式之适配器模式:深入JDK源码探秘Set类

在Java编程中&#xff0c;Set类作为一个不允许存储重复元素的集合&#xff0c;广泛应用于数据去重、集合运算等场景。然而&#xff0c;你是否曾好奇Set类是如何在底层实现元素唯一性判断的&#xff1f;这背后隐藏的力量正是适配器模式。 适配器模式简介 适配器模式&#xff0…...

java八股-流量封控系统

文章目录 请求后台管理的频率-流量限制流量限制的业务代码UserFlowRiskControlFilter 短链接中台的流量限制CustomBlockHandler 对指定接口限流UserFlowRiskControlConfigurationSentinelRuleConfig 请求后台管理的频率-流量限制 根据登录用户做出控制&#xff0c;比如 x 秒请…...

【WebRTC】Android SDK使用教学

文章目录 前言PeerConnectionFactoryPeerConnection 前言 最近在学习WebRTC的时候&#xff0c;发现只有JavaScript的API文档&#xff0c;找了很久没有找到Android相关的API文档&#xff0c;所以通过此片文章记录下在Android应用层如何使用WebRTC 本篇文章结合&#xff1a;【W…...

基于单片机的智能晾衣控制系统的设计与实现

摘要:本文是以 AT89C52 单片机为核心来实现智能晾衣控制系统。在这个系统中,雨水检测传感器是用来检测出雨的,而控制器将检测信号的变换,根据变换后的信号自动驱动直流电机将被风干 的棒收回,以便随时控制直流电机来实现晾衣;在光敏模块中检测昼夜的环境,自动控制晾衣杆…...

多人聊天室 NIO模型实现

NIO编程模型 Selector监听客户端不同的zhuangtai不同客户端触发不同的状态后&#xff0c;交由相应的handles处理Selector和对应的处理handles都是在同一线程上实现的 I/O多路复用 在Java中&#xff0c;I/O多路复用是一种技术&#xff0c;它允许单个线程处理多个输入/输出&…...

三、使用 Maven:命令行环境

文章目录 1. 第一节 实验一&#xff1a;根据坐标创建 Maven 工程1.1 Maven 核心概念&#xff1a;坐标1.2 实验操作1.3 Maven核心概念&#xff1a;POM1.4 Maven核心概念&#xff1a;约定的目录结构 2. 实验二&#xff1a;在 Maven 工程中编写代码2.1 主体程序2.2 测试程序 3. 执…...

Blender导入下载好的fbx模型像的骨骼像针戳/像刺猬

为什么我下载下来的骨骼模型和我自己绑定的模型骨骼朝向完全不一样 左边是下载的模型 右边是我自己绑定的模型 左边的模型刚刚感觉都是像针一样往外戳的&#xff0c;像刺猬一样那种。 解决方法勾选自动骨骼坐标系...

如何高效搭建智能BI数据分析系统

作为当今信息化时代&#xff0c;数据资产已经成为企业最为核心倚重的&#xff0c;自然企业也就面临来自于对内部这些数据的处理和分析。如何在大批量的数据当中提取有用信息&#xff0c;帮助企业做出智慧决策&#xff0c;是不少企业面临的问题。作为国内知名的BI数据分析系统服…...

第 6 章 Java 并发包中锁原理剖析Part one

目录 6.1 LockSupport 工具类 6.2 独占锁 ReentrantLock 的原理 获取锁 1&#xff0e;void lock() 方法 2&#xff0e;void lockInterruptibly() 方法 3&#xff0e;boolean tryLock() 方法 4&#xff0e;boolean tryLock(long timeout, TimeUnit unit) 方法 释放锁 6.1 Lo…...

使用 Canvas 绘制一个镂空的圆形区域

如果要实现一个类似人脸识别的界面&#xff0c;要求使用 canvas 进行绘制&#xff0c;中间镂空透明区域&#xff0c;背景是白色的画布。 技术方案&#xff1a; 首先&#xff0c;使用 canvas 绘制一个白色画布其次&#xff0c;使用 context.globalCompositeOperation 合成属性进…...

【Notepad++】---设置背景为护眼色(豆沙绿)最新最详细

在编程的艺术世界里&#xff0c;代码和灵感需要寻找到最佳的交融点&#xff0c;才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里&#xff0c;我们将共同追寻这种完美结合&#xff0c;为未来的世界留下属于我们的独特印记。 【Notepad】---设置背景为护眼色&#xf…...

2024 数学建模国一经验分享

2024 数学建模国一经验分享 背景&#xff1a;武汉某211&#xff0c;专业&#xff1a;计算机科学 心血来潮&#xff0c;就从学习和组队两个方面指点下后来者&#xff0c;帮新人避坑吧 2024年我在数学建模比赛中获得了国一&#xff08;教练说论文的分数是湖北省B组第一&#xff0…...

安全见闻2

安全见闻&#xff0c;犹如一座庞大而深邃的知识宝库&#xff0c;其中涵盖了形形色色的网络安全知识与错综复杂的网络技术体系。在当今数字化时代&#xff0c;这些领域的重要性不言而喻&#xff0c;它们不仅关乎个人信息的保护与隐私安全&#xff0c;更是支撑着整个互联网世界以…...

Web游戏开发指南:在 Phaser.js 中读取和管理游戏手柄输入

前言 Phaser.js 是一个广受欢迎的 HTML5 游戏框架&#xff0c;为开发者提供了创建跨平台 2D 游戏的强大工具。在现代游戏开发中&#xff0c;支持游戏手柄已成为提升玩家体验的重要方面。本文将详细介绍如何在 Phaser.js 中监听和处理游戏手柄的输入&#xff0c;帮助开发者为他…...

代码随想录32 动态规划理论基础,509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯。

1.动态规划理论基础 动态规划刷题大纲 什么是动态规划 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的…...

记录一个Flutter 3.24单元测试点击事件bug

哈喽&#xff0c;我是老刘 这两天发现一个Flutter 3.24版本的单元测试的一个小bug&#xff0c;提醒大家注意一下。 老刘自己写代码十多年了&#xff0c;写Flutter也6年多了&#xff0c;没想到前两天在一个小小的BottomNavigationBar 组件上翻了车。 给大家分享一下事件的经过。…...

使用Python将 word文档转pdf文档

第一步&#xff1a;我们需要导入支持包 >pip install pywin32 如果下载速度比较慢的话&#xff0c;可以考虑使用国内镜像源。 第二步&#xff1a;我们需要导入文件&#xff0c;这里采用 input,用户填入路径后&#xff0c;直接获取路径下的word文档&#xff0c;实现批量转换…...

基于C#+SQLite开发数据库应用的示例

SQLite数据库&#xff0c;小巧但功能强大&#xff1b;并且是基于文件型的数据库&#xff0c;驱动库就是一个dll文件&#xff0c;有些开发工具 甚至不需要带这个dll&#xff0c;比如用Delphi开发&#xff0c;用一些三方组件&#xff1b;数据库也是一个文件&#xff0c;虽然是个文…...

Vue基本语法

Options API 选项式/配置式api 需要在script中的export default一个对象对象中可以包含data、method、components等keydata是数据&#xff0c;数据必须是一个方法&#xff08;如果是对象&#xff0c;会导致多组件的时候&#xff0c;数据互相影响&#xff0c;因为对象赋值后&…...

芯片发展史

芯片的发展史可分为几个重要的阶段&#xff0c;从早期的真空管到现代的集成电路&#xff0c;反映了技术进步和创新的历程&#xff1a; 1. 真空管时代 (1904 - 1950年代) 真空管是20世纪初的电子元件&#xff0c;用于放大信号和开关&#xff0c;广泛应用在早期的收音机、电视机…...

我的知识图谱和Neo4j数据库的使用

知识图谱概述 知识图谱的含义 RDF与RDFS RDF&#xff08;Resource Description Framework&#xff0c;资源描述框架&#xff09;和RDFS&#xff08;RDF Schema&#xff0c;RDF模式&#xff09;是构建知识图谱的基础技术之一。它们提供了一种标准的方式来表示信息&#xff0c;…...

ASP.NET CORE API 解决跨域问题

环境 vs2022 .net 8 创建ASP.net Core API项目 配置跨域 编写ApiController 启动项目 得到服务器运行的 地址 在Hbuiler中创建web项目&#xff0c;编写代码 【运行】-【运行到浏览器】-选择一个浏览器,查看结果 正常显示 问题 如果允许所有源访问&#xff0c;有安全风险方…...

sram测试注意讨论

常规测试首先是mbist测试&#xff0c;原理不用多说&#xff0c;自己看&#xff0c;主要是注意点和考虑点&#xff1a; 1、明确测试用的到func_clk的频率的大小&#xff0c;根据经验值一般大于800M的时钟需要特别考虑Timing的问题&#xff1a;由于pr摆放的位置原因&#xff0c;…...

Mybatis 支持延迟加载的详细内容

延迟加载的概念深入 延迟加载是一种在处理复杂对象关系时非常有用的策略。在企业级应用开发中&#xff0c;数据库中的表之间往往存在着各种关联关系&#xff0c;如一对多&#xff08;一个用户有多个订单&#xff09;、多对多&#xff08;一个学生可以选多门课程&#xff0c;一门…...

word文档使用技巧笔记

中文和数字断开到第二行 word一串数字断开_百度知道 下划线对齐 word下划线怎么固定长度一致-百度经验...

使用docker-compose部署搜索引擎ElasticSearch6.8.10

背景 Elasticsearch 是一个开源的分布式搜索和分析引擎&#xff0c;基于 Apache Lucene 构建。它被广泛用于实时数据搜索、日志分析、全文检索等应用场景。 Elasticsearch 支持高效的全文搜索&#xff0c;并提供了强大的聚合功能&#xff0c;可以处理大规模的数据集并进行快速…...