12 React 组件通信 兄弟组件之间通信

12 React 组件通信 兄弟组件之间通信

在React中实现兄弟组件通信相对于父子组件通信来说稍微复杂一些,因为React本身是基于单向数据流的,兄弟组件之间并没有直接的通信途径。不过可以通过以下几种方式实现兄弟组件通信:

  1. 通过共同的父组件传递props
    父组件将需要共享的状态作为props传递给两个兄弟组件。

    // ParentComponent.js
    import React, { useState } from 'react';
    import FirstSibling from './FirstSibling';
    import SecondSibling from './SecondSibling';function ParentComponent() {const [sharedState, setSharedState] = useState("");return (<div><FirstSibling sharedState={sharedState} setSharedState={setSharedState} /><SecondSibling sharedState={sharedState} setSharedState={setSharedState} /></div>);
    }
    

    注意事项:

    • 父组件作为中介,将状态传递给两个兄弟组件。
    • 这种方法适用于兄弟组件之间的简单通信。
  2. 使用状态管理库
    可以使用像Redux、MobX或者Context API这样的状态管理库来管理共享状态,兄弟组件通过这些库来共享状态。

    // store.js (使用Redux举例)
    import { createStore } from 'redux';const initialState = {sharedState: ""
    };function reducer(state = initialState, action) {switch (action.type) {case 'UPDATE_SHARED_STATE':return { ...state, sharedState: action.payload };default:return state;}
    }const store = createStore(reducer);
    export default store;
    
    // FirstSibling.js
    import React from 'react';
    import { useDispatch } from 'react-redux';function FirstSibling() {const dispatch = useDispatch();const handleClick = () => {dispatch({ type: 'UPDATE_SHARED_STATE', payload: "Updated from First Sibling" });};return <button onClick={handleClick}>Update Shared State</button>;
    }
    
    // SecondSibling.js
    import React from 'react';
    import { useSelector } from 'react-redux';function SecondSibling() {const sharedState = useSelector(state => state.sharedState);return <div>{sharedState}</div>;
    }
    

    注意事项:

    • 使用状态管理库可以方便地在任何地方访问共享状态,但可能增加了复杂性。
    • 在Redux中,需要定义action和reducer来更新共享状态。
  3. 通过事件总线或自定义Hooks
    创建一个事件总线或者自定义Hooks,兄弟组件通过事件或者Hooks来通信。

    // EventBus.js
    import { EventEmitter } from 'events';const eventBus = new EventEmitter();
    export default eventBus;
    
    // FirstSibling.js
    import React from 'react';
    import eventBus from './EventBus';function FirstSibling() {const handleClick = () => {eventBus.emit('updateSharedState', "Updated from First Sibling");};return <button onClick={handleClick}>Update Shared State</button>;
    }
    
    // SecondSibling.js
    import React, { useState, useEffect } from 'react';
    import eventBus from './EventBus';function SecondSibling() {const [sharedState, setSharedState] = useState("");useEffect(() => {const updateState = (state) => {setSharedState(state);};eventBus.on('updateSharedState', updateState);return () => {eventBus.off('updateSharedState', updateState);};}, []);return <div>{sharedState}</div>;
    }
    

    注意事项:

    • 使用事件总线或自定义Hooks可以实现兄弟组件之间的解耦,但可能会导致全局状态的管理不清晰。

在实现兄弟组件通信时,需要注意以下几点:

  • 尽量保持兄弟组件之间的通信简单和直接,避免过度使用中间组件或全局状态。
  • 如果需要共享状态,考虑使用适当的状态管理方案,如Context API、Redux等。
  • 要注意兄弟组件之间的解耦,尽量避免直接依赖或修改其他组件的内部状态。

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

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

相关文章

Apache HTTP服务器(Linux离线编译安装)

Apache HTTP服务器&#xff08;Linux离线编译安装&#xff09; Apache是普通服务器&#xff0c;本身只支持html即普通网页。可以通过插件支持PHP,还可以与Tomcat连通(单向Apache连接Tomcat,就是说通过Apache可以访问Tomcat资源。反之不然)。 Apache和Tomcat都可以做为独立的w…

8个常见的数据可视化错误以及如何避免它们

在当今以数据驱动为主导的世界里&#xff0c;清晰且具有洞察力的数据可视化至关重要。然而&#xff0c;在创建数据可视化时很容易犯错误&#xff0c;这可能导致对数据的错误解读。本文将探讨一些常见的糟糕数据可视化示例&#xff0c;并提供如何避免这些错误的建议。 本文总结了…

Javascript由浅到深

关注我&#xff0c;持续分享逻辑思维&管理思维&#xff1b; 可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导&#xff1b; 有意找工作的同学&#xff0c;请参考博主的原创&#xff1a;《面试官心得--面试前应该如何准备》&#xff0c;《面试官心得--面试时如何进行自…

蓝桥杯day11刷题日记

P8615 [蓝桥杯 2014 国 C] 拼接平方数 思路&#xff1a;先把数据范围内的平方数打上标记&#xff0c;然后就是遍历这个区间&#xff0c;转成字符串&#xff08;好拆数据&#xff09;&#xff0c;用substr拆开数据&#xff0c;再强转成整数类型&#xff0c;最后查看拆开的数据是…

【WPF应用13】WPF基本控件-DockPanel布局详解与示例

引言 WPF (Windows Presentation Foundation) 是微软 .NET 框架的一个组成部分&#xff0c;它用于构建桌面应用程序的用户界面。在 WPF 中&#xff0c;控件是构建用户界面的基本元素&#xff0c;而布局控件则负责安排其他控件的位置和大小。DockPanel 是 WPF 中的一个布局控件&…

如何使用PHP和RabbitMQ实现消息队列?

前言 今天我们来做个小试验&#xff0c;用PHP和RabbitMQ实现消息队列功能。 前期准备&#xff0c;需要安装好docker、docker-compose的运行环境。 如何使用docker部署php服务_php如何使用docker发布-CSDN博客 一、安装RabbitMQ 1、创建相关目录&#xff0c;执行如下命令。…

计算机网络⑦ —— 网络层协议

1. ARP协议 在传输⼀个 IP 数据报的时候&#xff0c;确定了源 IP 地址和⽬标 IP 地址后&#xff0c;就会通过主机路由表确定 IP 数据包下⼀跳。然⽽&#xff0c;⽹络层的下⼀层是数据链路层&#xff0c;所以我们还要知道下⼀跳的 MAC 地址。由于主机的路由表中可以找到下⼀跳的…

手撕算法-接雨水

描述 分析 i位置能积累的雨水量&#xff0c;等于其左右两边最大高度的最小值。为了能获取i位置左右两边的最大高度。使用动态规划。两个dp数组&#xff1a; leftMaxrightMax 其中 leftMax[i] 代表i位置左边的最大高度rightMax[i] 代表i位置右边的最大高度 初始状态&#x…

npm 包管理工具:常用命令详解与使用指南

npm常用命令的更详细解释和使用场景&#xff1a; npm init 详细说明&#xff1a;此命令用于初始化一个新的Node.js项目。它会创建一个package.json文件&#xff0c;其中包含项目的基本信息&#xff0c;如名称、版本、描述、入口点&#xff08;main file&#xff09;、测试命令、…

Python Flask 自定义过滤器

{{ data.list | li2 }} li2就是自定义的 from flask import Flask, render_templateapp Flask(__name__)app.route("/index") def index():data {name: "张三","age": 18,list: [123123, 41, 123]}return render_template("index2.html…

[AIGC] 使用Spring Boot进行单元测试:一份指南

在现代软件开发过程中&#xff0c;确认你的应用正确运行是至关重要的一步。Spring Boot提供了一组实用工具和注解来辅助你在测试你的应用时&#xff0c;使得这个过程变得简单。下面就来分享一下如何在Spring Boot中进行单元测试。 文章目录 为什么需要单元测试Spring Boot单元测…

Redis中RDB中的文件写入

RDB文件的创建与载入。 有两个Redis命令可以用于生成RDB文件&#xff0c;一个是SAVE&#xff0c;另一个是BGSAVE. SAVE命令会阻塞Redis服务器进程&#xff0c;直到RDB文件创建完毕为止&#xff0c;在服务器进程阻塞期间&#xff0c;服务器 不能处理任何命令请求: 127.0.0.1:6…

枚举的详解

枚举的讲解 在C语言中&#xff0c;没有内置的枚举&#xff08;enum&#xff09;数据类型&#xff0c;但我们可以使用整数类型来模拟枚举的行为。C99标准之前&#xff0c;C语言使用#define指令来定义枚举&#xff0c;但这种方式并不安全&#xff0c;因为如果枚举值发生变化&…

Ubuntu Desktop Server - user 用户与 root 用户切换

Ubuntu Desktop Server - user 用户与 root 用户切换 1. user 用户与 root 用户切换2. root 用户与 user 用户切换References 1. user 用户与 root 用户切换 strongforeverstrong:~$ strongforeverstrong:~$ sudo su [sudo] password for strong: rootforeverstrong:/home/s…

【matlab程序】海洋资料的获取与分析--AO/NAO

海洋资料的获取与分析 相关数据代码等资料已上传入群中 海洋资料下载和介绍 AO和NAO指数均取自美国气候预测中心&#xff08;Climate Prediction Center, CPC&#xff09;发布的月平均指数&#xff0c;时间跨度为1950-2022年。由于AO和NAO在冬季最强&#xff0c;因此本文选取…

trt | torch2trt的使用方式

一、安装 1. 安装 tensorrt python 接口 下载 trt 包 .tar.gz https://developer.nvidia.com/nvidia-tensorrt-5x-download 解压 tar xvf TensorRT-6.0.1.5.Ubuntu-18.04.x86_64-gnu.cuda-10.1.cudnn7.6.tar.gz 安装 trt python 接口 cd pythonpip install tensorrt-6.0…

springboot结合mongodb使用(一)

配置连接 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId><version>${spring.boot.version}</version></dependency>#mongodb 这里是没有设置密码sprin…

406. 根据身高重建队列(力扣LeetCode)

文章目录 406. 根据身高重建队列题目描述贪心算法代码 406. 根据身高重建队列 题目描述 假设有打乱顺序的一群人站成一个队列&#xff0c;数组 people 表示队列中一些人的属性&#xff08;不一定按顺序&#xff09;。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi &…

阿里云倚天云服务器怎么样?如何收费?

阿里云倚天云服务器CPU采用倚天710处理器&#xff0c;租用倚天服务器c8y、g8y和r8y可以享受优惠价格&#xff0c;阿里云服务器网aliyunfuwuqi.com整理倚天云服务器详细介绍、倚天710处理器性能测评、CIPU架构优势、倚天服务器使用场景及生态支持&#xff1a; 阿里云倚天云服务…

2024.3.22FunPlus客户端开发工程师笔试记录

仅做笔试记录之用。 FunPlus客户端开发工程师笔试分为以下题型&#xff1a; 15道单选、5道多选、5道填空、2道编程 相比起上次考多益的时候&#xff0c;确实是感觉轻松多了。可能是选择题难度比起上次更简单的原因。这次的考题出的相对更加全面&#xff0c;但是同时显现出的就…