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

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介: 在上一篇文章《[React父子组件通信方式详解]》中我们学习到了React父子组件通信的4中方式。本文中我们将详细了解react兄弟组件通信方式。

前言

image.png

在上一篇文章《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;

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


✍创作不易,求关注😄,点赞👍,收藏⭐️

相关文章
|
4月前
|
XML JavaScript 前端开发
React Jsx语法入门
【8月更文挑战第13天】React Jsx语法入门
48 4
|
1月前
|
前端开发 JavaScript 定位技术
React 地图组件 Mapbox 入门指南
Mapbox 是一个强大的地图平台,提供丰富的地图数据和工具,支持多种开发语言和框架。本文介绍如何在 React 项目中使用 Mapbox,涵盖基础概念、安装配置、基本用法、常见问题及解决方法、高级用法等内容,并通过代码示例详细说明,帮助开发者提升地图应用的开发效率和用户体验。
98 2
|
1月前
|
前端开发 API UED
React 图片轮播 Carousel:从入门到进阶
本文介绍了在 React 中实现图片轮播(Carousel)的方法,从基础安装和配置 `react-slick` 开始,逐步讲解了常见问题如图片路径、性能优化、自定义样式和交互处理,以及高级话题如动态数据加载和响应式设计。通过详细示例,帮助开发者避免易错点,提升轮播图的用户体验。
39 3
|
1月前
|
监控 前端开发 JavaScript
React 静态网站生成工具 Next.js 入门指南
【10月更文挑战第20天】Next.js 是一个基于 React 的服务器端渲染框架,由 Vercel 开发。本文从基础概念出发,逐步探讨 Next.js 的常见问题、易错点及解决方法,并通过具体代码示例进行说明,帮助开发者快速构建高性能的 Web 应用。
93 10
|
2月前
|
前端开发 JavaScript 开发者
探索现代Web前端技术:React框架入门
【10月更文挑战第9天】 探索现代Web前端技术:React框架入门
|
3月前
|
消息中间件 前端开发
React技术栈-组件间通信的2种方式
本文介绍了React技术栈中组件间通信的两种方式:通过props传递数据和使用消息发布(publish)-订阅(subscribe)机制,并通过实例代码展示了如何使用PubSubJS库实现跨组件通信。
62 11
React技术栈-组件间通信的2种方式
|
3月前
|
移动开发 前端开发 JavaScript
构建高效跨平台移动应用:React Native入门指南
【8月更文挑战第47天】在移动开发领域,React Native凭借其跨平台特性和高效的开发模式赢得了开发者的青睐。本文将通过一个简易的待办事项应用实例,带领读者快速入门React Native,并展示如何利用JavaScript和React框架构建具有原生性能的应用。我们将探讨环境配置、界面布局、状态管理和数据流,以及如何打包和发布您的应用。准备好,让我们开始React Native之旅!
78 20
|
3月前
|
前端开发 JavaScript
React技术栈-React UI之ant-design使用入门
关于React技术栈中使用ant-design库的入门教程,包括了创建React应用、搭建开发环境、配置按需加载、编写和运行代码的步骤,以及遇到错误的解决方法。
52 2
React技术栈-React UI之ant-design使用入门
|
3月前
|
前端开发 JavaScript 开发者
Express.js与前端框架的集成:React、Vue和Angular的示例与技巧
本文介绍了如何将简洁灵活的Node.js后端框架Express.js与三大流行前端框架——React、Vue及Angular进行集成,以提升开发效率与代码可维护性。文中提供了详细的示例代码和实用技巧,展示了如何利用Express.js处理路由和静态文件服务,同时在React、Vue和Angular中构建用户界面,帮助开发者快速掌握前后端分离的开发方法,实现高效、灵活的Web应用构建。
74 3
|
3月前
|
XML 存储 前端开发
React 基础入门
【9月更文挑战第1天】本文详细介绍了由Facebook开发的JavaScript库React,涵盖环境搭建、基本概念、常见问题及解决方案。首先,通过安装Node.js、npm和Create React App快速搭建开发环境;接着,讲解了JSX、组件(包括函数和类组件)、state和props等核心概念;最后,针对JSX语法错误、state异步更新及props与state混淆等问题提供了具体的解决方法和示例代码,帮助读者更好地理解和应用React。
42 2