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

React中组件通信的几种方式

在构建复杂的React应用时,组件之间的通信是至关重要的。从简单的父子组件通信到跨组件状态同步,不同组件之间的通信方式多种多样。

1. 父子组件通信

父子组件通信是 React 中最基本的通信方式之一。在这种模式下,数据是从父组件通过 props 传递给子组件的,子组件接收到 props 后进行渲染或其他操作。

特点:
  • 单向数据流:数据从父组件流向子组件,子组件无法直接修改父组件传递过来的 props。

  • 简单明了:适用于父子组件之间的简单数据传递和交互。

  • 可维护性高:因为数据流清晰,易于追踪和调试。

父组件:

// 父组件import React, { Component } from 'react'
import CChild from "./components/C-Child"export default class CApp extends Component {state = {msg: '这是父组件的数据'}render() {return (<div><h2>父组件</h2><CChild msg={this.state.msg} /></div>)}
}


子组件:

// 子组件
import React, { Component } from 'react'export default class CChild extends Component {render() {return (<div><h4>子组件</h4><p>{this.props.msg}</p></div>)}
}

2. 子父组件通信

子父组件通信是指子组件向父组件传递数据或事件的过程。通常通过在子组件中定义回调函数,并将其作为 props 传递给子组件来实现。

特点:
  • 子组件向父组件传递数据或事件:子组件通过调用父组件传递的回调函数,向父组件传递数据或触发事件

  • 灵活性高:可以在需要的时候向父组件传递数据,实现灵活的交互。

  • PApp 组件定义了一个 callback 方法,这个方法用于接收子组件传递的数据。

父组件 PApp

在 render 方法中,PApp 渲染一个 PChild 子组件,并将 callback 方法作为 cb 属性传递给子组件。

//父组件PApp
import React, { Component } from 'react'
import PChild from './components/PChild'export default class PApp extends Component {state = {msg: ''}callback = (newMsg) => {console.log('拿到子组件的数据: ' + newMsg);this.setState({msg: newMsg})}render() {return (<div><h2>父组件 --- {this.state.msg}</h2>// 将回调函数传递给子组件 <PChild cb={this.callback} /></div>)}
}

子组件 PChild:

  • PChild 组件包含了一个状态 msg,代表子组件的数据。
  • PChild 组件有一个按钮,当按钮被点击时,触发 handler 方法。
  • handler 方法调用了父组件传递的回调函数 cb,并将子组件的状态数据 msg 作为参数传递给父组件。
 //子组件PChild
import React, { Component } from 'react'export default class PChild extends Component {state = {msg: '来自子组件的数据'}// 处理按钮点击事件,调用父组件传递的回调函数handler = () => {this.props.cb(this.state.msg)// 将子组件的数据传递给父组件}render() {return (<div><h4>子组件</h4><button onClick={this.handler}>传递</button></div>)}
}

3. 兄弟组件通信

兄弟组件通信是指不具有直接父子关系的两个组件之间进行数据传递和交互的过程。在 React 中,通常需要通过共享父组件来实现兄弟组件之间的通信。

注意:兄弟组件使用共同的父类作为桥梁,本质是父子之间通信。

  1. BApp 组件

    • BApp 组件是整个应用的父组件,它维护着一个状态 message,初始值为 'hello'

    • 在 render 方法中,BApp 返回了一个包含标题、BrotherA 和 BrotherB 组件的 JSX 结构。

    • 将 message 状态作为 BrotherB 组件的 props 传递给它。

import React, { Component } from 'react';
import BrotherA from "./components/BrotherA";
import BrotherB from "./components/BrotherB";class BApp extends Component {state = {message: 'hello'}// 回调函数,用于更新 message 状态// 注意:React 中状态更新通常使用 setState 方法fn = (newMsg) => {console.log('父组件收到:' + newMsg);this.setState({message: newMsg})}render() {return (<div><h1>父组件</h1>{/* 将 fn 方法作为 props 传递给 BrotherA 组件 */}<BrotherA cb={this.fn} />{/* 将 message 状态作为 props 传递给 BrotherB 组件 */}<BrotherB message={this.state.message} /></div>);}
}export default BApp;
  1. BrotherA 组件
  • 定义了一个局部变量 msg,它的值是字符串 '来自子组件A的数据'。
  • 定义了一个函数 handle,用于处理点击事件。当组件标题被点击时,会调用 props 中传递的 cb 函数,并传递 msg 变量作为参数。
  • 返回一个包含标题的 JSX 结构,在标题上设置了点击事件处理函数为 handle
import React from 'react';const BrotherA = props => {const msg = '来自子组件A的数据'const handle = () => {props.cb(msg)}return (<div><h4 onClick={handle}>子组件A</h4></div>);
};export default BrotherA;
  1. BrotherB 组件

    • BrotherB 组件接收一个名为 message 的 prop,它来自于 BApp 的状态。
    • 在组件中显示了一个标题和 message 的值。
import React from 'react';const BrotherB = props => {return (<div><h4>子组件B -- {props.message}</h4></div>);
};export default BrotherB;

4. 使用Context进行跨层级组件通信

当组件层级较深或通信的组件距离较远时,可以使用React的Context API进行跨层级通信。Context允许我们在组件树中传递数据,而不必手动通过Props一层层传递

创建:
  • 使用 React.createContext() 创建上下文对象
  • 并在组件中使用 Provider 提供数据,
  • 子组件通过 ConsumeruseContext 获取数据。

context.js

import React from 'react';// 创建一个上下文对象
const { Provider, Consumer } = React.createContext();// 导出 Provider 和 Consumer 组件,以便在其他地方使用
export {Provider,Consumer
}

BApp

  1. BApp 组件是一个类组件,它作为数据的提供者,使用 Provider 组件将数据传递给它的子组件。

  2. 在 BApp 组件的 render 方法中,通过 Provider 组件的 value 属性传递了一个名为 message 的状态值

// BApp.jsximport React, { Component } from 'react';
import BrotherB from "./components/BrotherB";import { Provider } from "./context.js";class BApp extends Component {state = {message: 'hello react', // 初始化状态值}render() {return (// 使用 Provider 组件提供数据<Provider value={this.state.message}><div><h1>父组件</h1>{/* 渲染子组件 */}<BrotherB /></div></Provider>);}
}export default BApp;

BrotherB

  1. BrotherB 组件是一个函数组件,它作为数据的消费者,使用 Consumer 组件从上层组件(BApp)获取数据并进行渲染。

  2. BrotherB 组件中,通过 Consumer 组件的子组件函数来接收从 Provider 传递下来的值,并进行相应的渲染。

// BrotherB.jsximport React from 'react';import { Consumer } from '../provider.js';const BrotherB = props => {return (// 使用 Consumer 组件消费数据<Consumer>{value => (<div>{/* 使用从 Provider 传递下来的值进行渲染 */}<h4>子组件B -- {value}</h4></div>)}</Consumer>);
};
export default BrotherB;

补充

在 Consumer 组件内部,我们可以使用函数作为子组件

  1. 使用函数作为子组件:
<Consumer>{value => (// 在这里可以直接使用 value 进行渲染或处理<div><h4>子组件B -- {value}</h4></div>)}
</Consumer>

在这个示例中,<Consumer> 组件的子元素是一个函数,该函数接收 value 参数,这个 value 参数就是从 Provider 传递下来的值。在函数内部,可以直接使用 value 进行渲染或处理。

这种方式适用于在 JSX 内部直接定义渲染逻辑,通常更易读,因为它直接放在了 <Consumer> 标签内部。

这样,就实现了 BApp 组件向 BrotherB 组件传递数据的功能。 Context API 的优点之一就是可以让组件之间直接传递数据,而无需通过 props 一层层地传递,从而简化了组件之间的关系。

相关文章:

React中组件通信的几种方式

在构建复杂的React应用时&#xff0c;组件之间的通信是至关重要的。从简单的父子组件通信到跨组件状态同步&#xff0c;不同组件之间的通信方式多种多样。 1. 父子组件通信 父子组件通信是 React 中最基本的通信方式之一。在这种模式下&#xff0c;数据是从父组件通过 props …...

python脚本实现csv中百度经纬度转84经纬度

数据准备 csv文件,带百度经纬度字段:bd09_x,bd09_y 目的 将百度经纬度转换为84经纬度,并在csv文件中添加两个字段:84_x,84_y python脚本 from ChangeCoordinate import ChangeCoordimport pandas as pd import numpy as npcoord = ChangeCoord()def bd09_to_wgs84...

syslog udp配置笔记

要将 /var/log/ 目录下的日志信息通过 UDP 发送到远程服务器,可以使用 rsyslog 的配置来实现。以下是详细步骤: 步骤 1:确保 rsyslog 已安装 如果 rsyslog 没有安装,请使用以下命令进行安装: 在 CentOS/RHEL: sudo yum install rsyslog在 Ubuntu/Debian: sudo apt-get i…...

Linux环境开启MongoDB的安全认证

文章目录 1. MongoDB安全认证简介1.1 访问控制1.2 角色1.3 权限 2. MongoDB中的常见角色3. MongoDB Shell3.1 下载MongoDB Shell3.2 通过MongoDB Shell连接MongoDB 4. 创建管理员用户5. 为具体的数据库创建用户6. 开启权限认证7. 重启MongoDB服务8. 连接MongoDB9. MongoDB数据库…...

django基于Python的农产品销售系统的设计与实现

摘 要 随着现代人们的快速发展&#xff0c;农产品销售系统已成为农产品的需求。该平台采用Python技术和django搭建系统框架&#xff0c;后台使用MySQL数据库进行信息管理&#xff1b;通过个人中心、用户管理、商家管理、产品类型管理、农产品管理、系统管理、订单管理等功能&a…...

linux复习5:C prog

编辑 缩排 为了使C源代码更加整洁易读&#xff0c;可以使用一些工具来自动格式化代码&#xff0c;例如cb&#xff08;C程序美化器&#xff09;、bcpp&#xff08;C美化器&#xff09;和indent等。 编译 编译并链接C文件 gcc hello.c -o hello 将 hello.c 编译并链接成可执行文…...

Go语言24小时极速学习教程(三)常见标准库用法

常见标准库 常见标准库即Go语言自带的库&#xff0c;这里的所有包都可以通过import直接引入&#xff0c;如果你觉得实在是不好用&#xff0c;那么请先保证你学会了标准库的基础上&#xff0c;再学一下Gookit&#xff0c;特别是其中的GoUtil&#xff0c;千万不要轻易自己去造轮…...

大数据环境下的高效数据清洗策略

大数据环境下的高效数据清洗策略 在当今这个信息爆炸的时代&#xff0c;大数据已成为企业决策和科学研究不可或缺的重要资源。然而&#xff0c;数据的海量性、多样性和复杂性也给数据处理带来了前所未有的挑战&#xff0c;其中数据清洗是确保数据质量和后续分析准确性的关键步…...

基于SpringBoot3+mybatis搭建的历史上的今天API接口服务 及 Mybatis 应该有个更好的方法来隐藏 Pojo 类中的字段

一、Mybatis有没有比较好的方法隐藏 Pojo 类中的字段 使用 Mybatis 时&#xff0c;为了实现通用的CURD&#xff0c;在定义实体类pojo时&#xff0c;会尽量将能用得上的数据库字段都定义到 pojo中&#xff0c;但是在查询的时候却有不一样的需求。mybatis的文档地址链接&#xff…...

Python 3 字符串

Python 3 字符串 字符串在Python中是一种基本的数据类型&#xff0c;用于存储文本数据。Python中的字符串是不可变的&#xff0c;这意味着一旦创建了一个字符串&#xff0c;就不能更改其内容。字符串可以用单引号&#xff08;&#xff09;、双引号&#xff08;"&#xff…...

Android集成FCM(Firebace Cloud Messaging )

集成FCM官方文档 Firebace主页面 将 Firebase 添加到您的 Android 应用 1、进入Firebace页面&#xff0c;创建自己的项目 2、点击自己创建好的项目&#xff0c;在右侧选择Cloud Messaging 3、点击Android去创建 google-services.json 4、将下载的 google-services.json 文件…...

基于 RBF 神经网络辨识的单神经元 PID 模型参考自适应控制

这是一个基于 RBF 神经网络辨识 和 单神经元 PID 模型参考自适应控制 的系统框图&#xff0c;包含以下主要部分&#xff1a; RBF 神经网络模块&#xff1a;用于对系统进行辨识&#xff0c;输入误差 e(t)e(t)e(t) 和误差变化量 Δe(t)\Delta e(t)Δe(t)&#xff0c;输出与系统特…...

2024年 Web3开发学习路线全指南

Web3是一个包含了很多领域的概念&#xff0c;不讨论币圈和链圈的划分&#xff0c;Web3包括有Defi、NFT、Game等基于区块链的Dapp应用的开发&#xff1b;也有VR、AR等追求视觉沉浸感的XR相关领域的开发&#xff1b;还有基于区块链底层架构或者协议的开发。 这篇文章给出的学习路…...

Ubuntu22.04LTS 部署前后端分离项目

一、安装mysql8.0 1. 安装mysql8.0 # 更新安装包管理工具 sudo apt-get update # 安装 mysql数据库&#xff0c;过程中的选项选择 y sudo apt-get install mysql-server # 启动mysql命令如下 &#xff08;停止mysql的命令为&#xff1a;sudo service mysql stop&#xff0…...

「Mac玩转仓颉内测版23」基础篇3 - 深入理解整数类型

本篇将详细讲解Cangjie中的整数类型&#xff0c;探讨整数的定义、操作、表示范围、进制表示、类型转换及应用场景&#xff0c;帮助开发者在Cangjie中灵活运用整数类型构建程序逻辑。 关键词 有符号整数与无符号整数表示范围与溢出进制表示类型转换字面量与操作 一、整数类型概…...

渗透测试导学

渗透测试导学 渗透测试概念 渗透测试是干什么&#xff1f; 渗透测试的定义和目的&#xff1a;渗透测试是一种通过模拟恶意黑客的攻击方法&#xff0c;来评估计算机网络系统安全性能的评估方法。它的目的是通过识别安全问题&#xff0c;帮助了解当前的安全状况&#xff0c;从而…...

Django实现智能问答助手-基础配置

设置 Django 项目、创建应用、定义模型和视图、实现问答逻辑&#xff0c;并设计用户界面。下面是一步一步的简要说明&#xff1a; 目录&#xff1a; QnAAssistant/ # 项目目录 │ ├── QnAAssistant/ # 项目文件夹 │ ├── init.py # 空文件 │ ├── settings.py # 项目配…...

亚马逊商品详情API接口解析,Json数据示例返回

亚马逊的商品详情API接口&#xff08;如Amazon Product Advertising API&#xff09;允许开发者获取商品的详细信息&#xff0c;包括价格、描述、图片URL等。以下是一个示例的JSON数据返回结构&#xff0c;以及相应的解析说明。请注意&#xff0c;实际返回的数据结构可能会根据…...

git根据远程分支创建本地新分支

比如我当前本地仓库有4个 remote 仓库&#xff0c;我希望根据其中的一个 <remote>/<branch> 创建本地分支&#xff1a; 先使用 github fetch <remote> 拉取 <remote> 的分支信息&#xff0c;然后在 git checkout -b 创建新分支时使用 -t <remote>…...

Android U 多任务启动分屏——SystemUI流程(更新中)

前文 Android U 多任务启动分屏——Launcher流程&#xff08;下分屏&#xff09; 前文说到通过ISplitScreen接口跨进程调用到了SystemUI进程&#xff0c;我们继续分析分屏在systemui中的实现。 wmshell实现分屏 实现ISplitScreen接口 代码路径&#xff1a;frameworks/base/…...

【灶台导航】 RAG系统的容错设计:从向量搜索到关键词降级,一个都不能少

当三个外部依赖都可能随时挂掉时&#xff0c;如何保证用户永远有响应&#xff1f;问题&#xff1a;完美主义害死人 做RAG系统时&#xff0c;我们很容易陷入一种思维定势&#xff1a;向量检索要准、LLM要强、整个链路要丝滑。但现实是——任何一个外部服务挂了&#xff0c;用户就…...

NodeMCU固件烧录终极指南:告别命令行,5分钟搞定ESP8266刷机!

NodeMCU固件烧录终极指南&#xff1a;告别命令行&#xff0c;5分钟搞定ESP8266刷机&#xff01; 【免费下载链接】nodemcu-pyflasher Self-contained NodeMCU flasher with GUI based on esptool.py and wxPython. 项目地址: https://gitcode.com/gh_mirrors/no/nodemcu-pyfl…...

抖音无水印下载器:终极免费批量下载工具完全指南

抖音无水印下载器&#xff1a;终极免费批量下载工具完全指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖…...

绕过Cursor AI消费限额前端Bug:浏览器控制台脚本实现API直接管理

1. 项目概述与背景 最近在深度使用Cursor这款AI代码编辑器时&#xff0c;遇到了一个挺让人头疼的问题。Cursor的付费模式是典型的用量计费&#xff0c;也就是所谓的“按需付费”&#xff0c;这对于我们这些高频使用者来说&#xff0c;确实需要设置一个消费上限&#xff0c;以防…...

过零电压比较器基础知识及Multisim电路仿真

目录 2.9 过零电压比较器 2.9.1 过零电压比较器基础知识 1.电路结构与核心定义 2. 工作原理 3. 核心特点与用途 2.9.2 过零电压比较器Multisim电路仿真 2. 仿真逻辑与工作原理 3. 波形解读(右侧瞬态分析结果) 摘要:过零电压比较器是一种阈值电压为0V的单限比较器,利…...

知识付费浪潮下的技术学习:是捷径,还是新的信息茧房?

当“知识”成为一种商品打开手机&#xff0c;各类技术公众号、知识星球、极客时间专栏、慕课网实战课、B站充电视频……铺天盖地的“测试开发进阶”“性能测试大师班”“自动化测试框架实战”正以9.9元、199元、3999元的价格被明码标价。作为一名软件测试工程师&#xff0c;我们…...

芯片入门必看:CPU、MCU、SoC、GPU、TPU、NPU

本文首先介绍了芯片的基础分类&#xff0c;包括模拟/数字芯片和逻辑/计算芯片。接着&#xff0c;对8类核心芯片进行了通俗解析&#xff0c;包括CPU、MCU、SoC、GPU、TPU、NPU、FPGA和DSP&#xff0c;涵盖了它们的定义、用途、类型和代表性标的。最后&#xff0c;文章从通用性和…...

ClawGuard:为Clawdbot AI智能体打造的安全监控与熔断防护系统

1. 项目概述&#xff1a;ClawGuard 是什么&#xff0c;以及为什么你需要它如果你正在使用或开发基于 Clawdbot 框架的 AI 智能体&#xff0c;那么“安全”和“可控”这两个词&#xff0c;大概率已经在你脑海里盘旋过无数次了。我接触过不少团队&#xff0c;从最初的兴奋于 AI 智…...

2.2 本地文件读取

本章学习目标&#xff1a; 知道CSV、Excel、JSON三种文件分别怎么读、会遇到什么常见问题理解每种文件格式的“坑”在哪里&#xff0c;以及如何向AI描述解决方案学会用“人话”告诉AI你要做什么&#xff0c;让AI生成代码不需要记住任何函数名或参数&#xff0c;只需要知道“有什…...

5月12日直播 | CANN Bench:为昇腾算子评测立起一把统一的尺子

CANN Bench&#xff1a;为昇腾算子评测立起一把统一的尺子 当 Coding Agent 一次写出几十个算子已成为常态&#xff0c;"什么算优质算子"变成了一个单一维度无法评估准确的问题&#xff1a;能不能过编译只是入场券&#xff0c;精度是否经得起验证、换个 shape 换个 d…...