【react从入门到精通】React兄弟组件通信方式详解(有示例)

news2025/1/18 14:00:59

文章目录

  • 前言
  • React技能树
  • 通过共同的父组件传递props
  • 使用React Context
  • 使用Redux
  • 使用EventBus
  • 写在最后

在这里插入图片描述

前言

在上一篇文章《React父子组件通信方式详解》中我们了解了React父子组件通信的4中方式。

本文中我们将详细了解react兄弟组件通信方式。

React技能树

React 技能树
├── JSX
│   ├── 语法
│   ├── 元素渲染
│   ├── 组件
│   ├── Props
│   ├── State
│   └── 生命周期
├── 组件通信
│   ├── 父子组件通信
│   ├── 兄弟组件通信
│   ├── 跨级组件通信
│   ├── Context
│   └── Redux
├── 样式
│   ├── 内联样式
│   ├── CSS Modules
│   └── Styled Components
├── 路由
│   ├── React Router
│   ├── 动态路由
│   └── 嵌套路由
├── 数据请求
│   ├── Axios
│   ├── Fetch
│   └── GraphQL
├── 状态管理
│   ├── Redux
│   ├── MobX
│   └── Recoil
├── 常用库和框架
│   ├── Ant Design
│   ├── Material UI
│   ├── Bootstrap
│   ├── Semantic UI
│   └── Tailwind CSS
├── 测试
│   ├── Jest
│   ├── Enzyme
│   └── React Testing Library
├── 构建工具
│   ├── Webpack
│   └── Parcel
└── 服务端渲染
    ├── Next.js
    └── Gatsby

在React中,组件之间的通信可以通过父组件向子组件传递props,也可以通过子组件向父组件传递事件回调函数来实现。但是,如果兄弟组件之间需要进行通信,React并没有提供内置的方式来实现这一点。但是,我们可以通过一些技巧来实现兄弟组件之间的通信,如下所示:

通过共同的父组件传递props

// Parent Component
import React, { useState } from 'react';
import BrotherA from './BrotherA';
import BrotherB from './BrotherB';

function Parent() {
  const [message, setMessage] = useState('');
  
  const handleSend = (message) => {
    setMessage(message);
  }
  
  return (
    <div>
      <BrotherA onSend={handleSend} />
      <BrotherB message={message} />
    </div>
  );
}

// BrotherA Component
import React, { useState } from 'react';

function BrotherA(props) {
  const [message, setMessage] = useState('');

  const handleClick = () => {
    props.onSend(message);
  }

  return (
    <div>
      <input type="text" value={message} onChange={(e) => setMessage(e.target.value)} />
      <button onClick={handleClick}>Send</button>
    </div>
  );
}

// BrotherB Component
import React from 'react';

function BrotherB(props) {
  return (
    <div>
      <p>{props.message}</p>
    </div>
  );
}

在上面的示例中,Parent组件作为BrotherA和BrotherB组件的父组件,它负责传递BrotherB需要的消息,同时它也传递了一个onSend回调函数给BrotherA,以便BrotherA可以调用该函数并传递消息。

使用React Context

另一种实现兄弟组件之间通信的方式是使用React Context,它可以让我们在组件之间共享数据。

在下面这个示例中,我们将使用React Context API来创建一个全局状态管理器,BrotherA和BrotherB组件都可以访问和更新该状态。我们需要在应用程序中定义一个名为MessageContext的React context,并提供一个名为setMessage的操作函数来更新message状态。

// MessageContext.js

import { createContext } from 'react';

const MessageContext = createContext({
  message: '',
  setMessage: () => {},
});

export default MessageContext;

在App组件中,我们需要使用MessageContext.Provider组件包装BrotherA和BrotherB组件,以便它们可以访问MessageContext。

// App.js

import BrotherA from './BrotherA';
import BrotherB from './BrotherB';
import MessageContext from './MessageContext';

function App() {
  const [message, setMessage] = useState('');

  return (
    <div>
      <MessageContext.Provider value={{ message, setMessage }}>
        <BrotherA />
        <BrotherB />
      </MessageContext.Provider>
    </div>
  );
}

export default App;

在BrotherA组件中,我们可以使用useContext hook来从MessageContext中获取setMessage操作函数,并调用它来更新message状态。

// BrotherA.js

import { useContext } from 'react';
import MessageContext from './MessageContext';

function BrotherA() {
  const { setMessage } = useContext(MessageContext);

  function handleClick() {
    setMessage('Hello from BrotherA!');
  }

  return (
    <div>
      <button onClick={handleClick}>Send message to BrotherB</button>
    </div>
  );
}

export default BrotherA;

在BrotherB组件中,我们也可以使用useContext hook来从MessageContext中获取message状态。

// BrotherB.js

import { useContext } from 'react';
import MessageContext from './MessageContext';

function BrotherB() {
  const { message } = useContext(MessageContext);

  return (
    <div>
      <p>Message from BrotherA: {message}</p>
    </div>
  );
}

export default BrotherB;

这两种方法都可以实现兄弟组件之间的通信,具体选择哪种方法取决于你的具体需求。在一些情况下,使用Context可能更方便,因为它可以减少需要传递的props的数量。但是,在其他情况下,使用父组件传递props可能更加直接和可读性更好。

除了在父组件中传递props和使用React Context之外,还有一些其他的方式可以实现兄弟组件之间的通信。以下是其中一些常见的方法:

使用Redux

使用Redux可以方便地共享状态和管理应用程序的状态,因此它也可以用于兄弟组件之间的通信。通过将状态存储在Redux store中,兄弟组件可以在需要时访问并更新该状态。这种方法需要在应用程序中引入Redux,需要在Redux store中定义状态和操作状态的函数。

在这个示例中,我们将使用Redux来管理message状态,BrotherA和BrotherB组件都可以访问和更新该状态。我们需要在应用程序中安装Redux,并定义一个包含message状态的Redux store,以及更新该状态的操作函数。

// store.js

import { createStore } from 'redux';

const initialState = { message: '' };

function messageReducer(state = initialState, action) {
  switch (action.type) {
    case 'SET_MESSAGE':
      return { ...state, message: action.payload };
    default:
      return state;
  }
}

export const store = createStore(messageReducer);

在BrotherA组件中,我们可以使用useSelector hook来从Redux store中获取message状态,以及使用useDispatch hook来调用setMessage操作函数。

// BrotherA.js

import { useSelector, useDispatch } from 'react-redux';

function BrotherA() {
  const message = useSelector(state => state.message);
  const dispatch = useDispatch();

  function handleClick() {
    dispatch({ type: 'SET_MESSAGE', payload: 'Hello from BrotherA!' });
  }

  return (
    <div>
      <p>Message from BrotherB: {message}</p>
      <button onClick={handleClick}>Send message to BrotherB</button>
    </div>
  );
}

export default BrotherA;

在BrotherB组件中,我们也可以使用useSelector hook来从Redux store中获取message状态,以及使用useDispatch hook来调用setMessage操作函数。

// BrotherB.js

import { useSelector, useDispatch } from 'react-redux';

function BrotherB() {
  const message = useSelector(state => state.message);
  const dispatch = useDispatch();

  function handleClick() {
    dispatch({ type: 'SET_MESSAGE', payload: 'Hello from BrotherB!' });
  }

  return (
    <div>
      <p>Message from BrotherA: {message}</p>
      <button onClick={handleClick}>Send message to BrotherA</button>
    </div>
  );
}

export default BrotherB;

使用EventBus

EventBus是一个事件总线,可以让组件之间通过发布和订阅事件来通信。通过使用EventBus,兄弟组件可以在需要时发布事件,并通过订阅事件来接收其他组件发送的事件。这种方法需要在应用程序中引入EventBus库,并使用事件名称来标识特定事件。

在这个示例中,我们将使用EventBus库来实现BrotherA和BrotherB组件之间的通信。我们需要在应用程序中安装EventBus库,并定义一个事件总线。在BrotherA组件中,我们可以使用EventBus来发布名为’message’的事件,并在BrotherB组件中订阅该事件。

// EventBus.js

import { EventEmitter } from 'events';

const eventBus = new EventEmitter();

export default eventBus;
在BrotherA组件中,我们可以使用EventBus来发布名为'message'的事件。

javascript
Copy code
// BrotherA.js

import eventBus from './EventBus';

function BrotherA() {
  function handleClick() {
    eventBus.emit('message', 'Hello from BrotherA!');
  }

  return (
    <div>
      <button onClick={handleClick}>Send message to BrotherB</button>
    </div>
  );
}

export default BrotherA;

在BrotherB组件中,我们可以使用EventBus来订阅名为’message’的事件,并在事件被触发时更新message状态。

// BrotherB.js

import { useState, useEffect } from 'react';
import eventBus from './EventBus';

function BrotherB() {
  const [message, setMessage] = useState('');

  useEffect(() => {
    const handleEvent = (data) => {
      setMessage(data);
    };
    eventBus.on('message', handleEvent);
    return () => {
      eventBus.off('message', handleEvent);
    };
  }, []);

  return (
    <div>
      <p>Message from BrotherA: {message}</p>
    </div>
  );
}

export default BrotherB;

以上这些方法都可以实现兄弟组件之间的通信,但它们的实现和使用方法各有不同,具体取决于你的具体需求和应用程序的复杂性。

写在最后

✨原创不易,希望各位大佬多多支持。

👍点赞,你的认可是我创作的动力。

⭐️收藏,感谢你对本文的喜欢。

✏️评论,你的反馈是我进步的财富。

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

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

相关文章

如何利用分钟级降水预报 API 优化城市水利管理?

引言 降水预报对于城市水利管理部门来说至关重要&#xff0c;它可以帮助管理者及时了解当地的降雨情况&#xff0c;以便更好地管理城市水利设施&#xff0c;保障公共安全。然而&#xff0c;传统的降水预报数据一般只提供每小时或每3小时的粗略预报数据&#xff0c;无法满足城市…

服务部分综合实验

#每台机子关闭防火墙和selinux ##NFS test1 10 ##部署共享存储 test1 10 systemctl stop firewalld systemctl disable firewalld setenforce 0 cd /opt/ mkdir nfs cd nfs/ mkdir web1 web2 echo "this is web1" > web1/index.html echo "this is web2&quo…

八大排序[超级详细](动图+代码优化)这一篇文章就够了

目录 什么是排序&#x1f36d; 什么是稳定性&#x1f36d; 交换排序的基本思想&#x1f36d; 一、冒泡排序&#x1f36d; 1、基本思想&#x1f349; 2、实现代码&#x1f349; 3、代码优化&#x1f349; Ⅰ、 &#x1f9c1;冒泡排序的优化1 Ⅱ、&#x1f9c1;冒泡排序的优…

云安全技术——搭建VPN

目录 二、VPN简介 三、规划实训环境和网络拓扑 配置VPN服务器 五、VPN网络客户端的配置 六、远程访问VPN的检测 二、VPN简介 VPN&#xff08;Virtual Private Network&#xff09;是一种可以在公共网络上建立安全连接的技术。VPN是实现保密通信的基本手段&#xff0c;在wi…

玩转服务器之Java Web篇:手把手教你搭建Java Web环境

前言 Java Web项目&#xff0c;简单来说就是我们在浏览器上可以看到的内容。就简单的Web来说&#xff0c;服务器上也同样需要有计算机上所需要的运行环境&#xff0c;如&#xff1a;java,tomcat,mysql 。Java Web环境可以用来开发和部署各种Web应用程序&#xff0c;例如网站、…

11-Vue技术栈之插槽的使用

目录 1、作用2、分类3、使用方式4、插槽的应用 1、作用 让父组件可以向子组件指定位置插入html结构&#xff0c;也是一种组件间通信的方式&#xff0c;适用于 父组件 > 子组件 。 2、分类 默认插槽、具名插槽、作用域插槽 3、使用方式 默认插槽&#xff1a; 父组件中&am…

《走进对象村2》特殊的- static

文章目录 &#x1f680;文章导读1.1static修饰成员变量1.2static修饰成员方法1.3代码块1.3.1代码块概念及分类以及不同代码块之间的运行顺序1、普通代码块2、构造代码块3、静态代码块 static存在的意义面试题&#xff1a;1、static的独特之处2、 静态变量和实例变量的区别3、静…

前端——HTML

1.html的标准结构 【1】先建立一个普通文本文档&#xff0c;将文本的后缀改为.html 【2】编辑&#xff1a;标准结构 <html> <head></head> <body> this is my first </body> </html> 最外层是标签<html>然后<head>标…

如何用 AI 练英语口语?

语言学习&#xff0c;就得靠多训练。 痛点 有的小伙伴学了很长时间的英语&#xff0c;但学到的却是「哑巴英语」&#xff0c;特点是见着外国人张不开嘴。这里面有多种因素&#xff0c;但最主要还是练得太少。语言这东西就得靠多训练。经常和外国人说话&#xff0c;语言能力很快…

HTML常用标签总结

文章目录 HTML结构HTML常见标签注释标题标签h1 - h6段落标签p换行标签br格式化标签图片标签img超链接标签a表格标签table列表标签ul ol dl表单标签select标签textarea标签无语义标签div和span HTML结构 形如&#xff1a; <body></body>这样的标签就是一个HTML标签…

15.Java基础

1.xml 1.1概述【理解】 万维网联盟(W3C) 万维网联盟(W3C)创建于1994年&#xff0c;又称W3C理事会。1994年10月在麻省理工学院计算机科学实验室成立。 建立者&#xff1a; Tim Berners-Lee (蒂姆伯纳斯李)。 是Web技术领域最具权威和影响力的国际中立性技术标准机构。 到目前为…

linux部署k8s

linux部署k8s 0、k8s的前世今生1、下载k8s2、k8s文档2.1、容器化部署的优越性2.1.1、Traditional deployment era2.1.2、Virtualized deployment era2.1.3、Container deployment era 3、安装k8s3.1、Install kubectl on Linux3.2、 0、k8s的前世今生 参考链接: https://kuber…

《基于智能手机采集的PPG信号预测血管老化》阅读笔记

目录 一、论文摘要 二、论文十问 Q1: Q1论文试图解决什么问题&#xff1f; Q2: 这是否是一个新的问题&#xff1f; Q3: 这篇文章要验证一个什么科学假设&#xff1f; Q4: 有哪些相关研究&#xff1f;如何归类&#xff1f;谁是这一课题在领域内值得关注的研究员&#xff1f…

OpenCV的highgui模块

Opencv把用于操作系统、文件系统以及摄像机等硬件设备交互的函数纳入到highgui&#xff08;High-level Graphical User Interface)模块中&#xff0c;我们可以利用该模块方便地打开窗口、显示图像、读出或写入图像相关的文件&#xff08;图像和视频&#xff09;、处理简单的鼠标…

【大数据之Hadoop】二十六、生产调优-HDFS集群压测

测试上传数据到集群和拉取数据的时间。HDFS的读写性能主要受网络和磁盘影响比较大。为了方便测试&#xff0c;将hadoop102、hadoop103、hadoop104虚拟机网络的带宽都设置为100Mbps。100Mbps/812.5M/s。 1 测试HDFS写性能 写测试原理&#xff1a;   向磁盘写测试文件&#x…

MySQL数据库——MySQL下载安装

&#xff08;1&#xff09;数据库相关概念&#xff1a; &#xff08;2&#xff09;MySQL数据库下载&#xff08;windows版&#xff09;: 下载地址&#xff1a;MySQL :: Download MySQL Installerhttps://dev.mysql.com/downloads/installer/MySQL :: Download MySQL Installer…

Python小姿势 - Python中的类型检查

Python中的类型检查 在Python中&#xff0c;类型检查是通过内置函数isinstance()来实现的。 isinstance() 函数用于判断一个对象是否是一个已知的类型&#xff0c;类似 type()。 isinstance() 与 type() 区别&#xff1a; type() 不会认为子类是一种父类类型。 isinstance() 会…

【Linux下】线程概念

文章目录 【Linux下】线程概念理解线程线程操作接口线程和进程线程和进程的关系代码验证 线程优点线程缺点 【Linux下】线程概念 理解线程 一般的书上都是这么描述线程的 线程&#xff1a;是在进程内部运行的一个执行分支&#xff0c;属于进程的一部分&#xff0c;粒度要比进…

简单搭建Fabric网络

Fabric网络的搭建分为两个阶段&#xff1a;生成网络拓扑和启动网络。在这里&#xff0c;我们假设要搭建一个具有一个orderer节点和两个peer节点的Fabric网络。 在生成网络拓扑之前&#xff0c;需要准备好以下文件&#xff1a; crypto-config.yaml&#xff1a;用于生成组织和节…

什么牌子蓝牙耳机好用不贵?国产性价比高的蓝牙耳机推荐

相较于有线耳机&#xff0c;无线蓝牙耳机更便携、功能更丰富&#xff0c;不用受到耳机孔与线的限制。那么&#xff0c;什么牌子的蓝牙耳机好用不贵&#xff1f;针对这个问题&#xff0c;我给大家推荐几款国产性价比高的蓝牙耳机&#xff0c;可以当个参考。 一、南卡小音舱Lite…