react实现组件通信的案例

当使用React构建应用程序时,组件通信是一个重要的话题。以下是一个示例,演示了如何使用React实现组件间的通信:

  1. 常规方法:
// ParentComponent.js
import React, { useState } from 'react';
import ChildComponent from './ChildComponent';const ParentComponent = () => {const [message, setMessage] = useState('');const handleMessageChange = (newMessage) => {setMessage(newMessage);};return (<div><h2>Parent Component</h2><ChildComponent onMessageChange={handleMessageChange} /><p>Message from child: {message}</p></div>);
};export default ParentComponent;
// ChildComponent.js
import React, { useState } from 'react';const ChildComponent = ({ onMessageChange }) => {const [inputValue, setInputValue] = useState('');const handleMessageSubmit = () => {onMessageChange(inputValue);};return (<div><h3>Child Component</h3><inputtype="text"value={inputValue}onChange={(e) => setInputValue(e.target.value)}/><button onClick={handleMessageSubmit}>Send Message</button></div>);
};export default ChildComponent;

在这个例子中,ParentComponent 是父组件,ChildComponent 是子组件。父组件包含一个存储消息的状态 message,并将其作为 onMessageChange 函数的参数传递给子组件。子组件包含一个输入框和一个按钮,用于输入和提交消息。

当子组件中的按钮被点击时,它将调用父组件传递的 onMessageChange 函数,并将当前输入框的值作为参数传递。父组件中的 handleMessageChange 函数将被调用,并更新父组件的 message 状态。

最后,父组件将接收到的消息显示在页面上。

当涉及到不同的组件间通信方式时,代码案例可以帮助更好地理解。以下是每种通信方式的详细代码案例。

  1. Props传递:
// ParentComponent.js
import React from 'react';
import ChildComponent from './ChildComponent';const ParentComponent = () => {const message = 'Hello from the parent component';return (<div><h2>Parent Component</h2><ChildComponent message={message} /></div>);
};export default ParentComponent;
// ChildComponent.js
import React from 'react';const ChildComponent = (props) => {return (<div><h3>Child Component</h3><p>Message from parent: {props.message}</p></div>);
};export default ChildComponent;

在这个例子中,通过将 message 作为props传递给子组件 ChildComponent ,子组件可以通过 props 对象访问和显示这个消息。

  1. Context API:
// MyContext.js
import React from 'react';const MyContext = React.createContext();export default MyContext;
// ParentComponent.js
import React from 'react';
import ChildComponent from './ChildComponent';
import MyContext from './MyContext';const ParentComponent = () => {const message = 'Hello from the parent component';return (<div><h2>Parent Component</h2><MyContext.Provider value={message}><ChildComponent /></MyContext.Provider></div>);
};export default ParentComponent;
// ChildComponent.js
import React from 'react';
import MyContext from './MyContext';const ChildComponent = () => {return (<div><h3>Child Component</h3><MyContext.Consumer>{(message) => <p>Message from parent: {message}</p>}</MyContext.Consumer></div>);
};export default ChildComponent;

在这个例子中,通过创建一个上下文 MyContext ,父组件 ParentComponent 在提供者(Provider)中设置了共享的数据 message 。子组件 ChildComponent 使用消费者(Consumer)来访问和显示这个消息。

  1. Redux:

首先,确保已安装redux和react-redux依赖项。

npm install redux react-redux
// store.js
import { createStore } from 'redux';const initialState = {message: 'Hello from Redux',
};const reducer = (state = initialState, action) => {switch (action.type) {case 'UPDATE_MESSAGE':return {...state,message: action.payload,};default:return state;}
};const store = createStore(reducer);export default store;
// ParentComponent.js
import React from 'react';
import { connect } from 'react-redux';const ParentComponent = ({ message, updateMessage }) => {const handleMessageChange = () => {updateMessage('New message from parent');};return (<div><h2>Parent Component</h2><p>Message: {message}</p><button onClick={handleMessageChange}>Change Message</button></div>);
};const mapStateToProps = (state) => {return {message: state.message,};
};const mapDispatchToProps = (dispatch) => {return {updateMessage: (newMessage) =>dispatch({ type: 'UPDATE_MESSAGE', payload: newMessage }),};
};export default connect(mapStateToProps, mapDispatchToProps)(ParentComponent);
// ChildComponent.js
import React from 'react';
import { connect } from 'react-redux';const ChildComponent = ({ message }) => {return (<div><h3>Child Component</h3><p>Message from parent: {message}</p></div>);
};const mapStateToProps = (state) => {return {message: state.message,};
};export default connect(mapStateToProps)(ChildComponent);

在这个例子中,首先创建一个Redux store,并定义初始状态和reducer函数来处理状态更新。然后,在父组件 ParentComponent 中,使用 connect 函数来连接Redux store,将 message 状态映射到组件的props,并提供一个 updateMessage 函数来更新消息。子组件 ChildComponent在这个例子中,首先创建一个Redux store,并定义初始状态和reducer函数来处理状态更新。然后,在父组件 ParentComponent中,使用connect函数来连接Redux store,将message状态映射到组件的props,并提供一个updateMessage函数来更新消息。子组件ChildComponent通过connect函数将message` 状态映射到组件的props,然后可以访问和显示这个消息。

  1. 发布/订阅模式:

首先,确保已安装eventemitter3依赖项。

npm install eventemitter3
// eventEmitter.js
import EventEmitter from 'eventemitter3';const eventEmitter = new EventEmitter();export default eventEmitter;
// ParentComponent.js
import React from 'react';
import eventEmitter from './eventEmitter';const ParentComponent = () => {const handleMessageChange = () => {eventEmitter.emit('messageChange', 'New message from parent');};return (<div><h2>Parent Component</h2><button onClick={handleMessageChange}>Change Message</button></div>);
};export default ParentComponent;
// ChildComponent.js
import React, { useEffect, useState } from 'react';
import eventEmitter from './eventEmitter';const ChildComponent = () => {const [message, setMessage] = useState('');useEffect(() => {const handleEvent = (newMessage) => {setMessage(newMessage);};eventEmitter.on('messageChange', handleEvent);return () => {eventEmitter.off('messageChange', handleEvent);};}, []);return (<div><h3>Child Component</h3><p>Message from parent: {message}</p></div>);
};export default ChildComponent;

在这个例子中,通过使用第三方库 eventemitter3 创建一个事件发射器 eventEmitter 。父组件 ParentComponent 在按钮点击事件中触发 messageChange 事件,并将新的消息作为参数传递。子组件 ChildComponent 使用 useEffect 来订阅 messageChange 事件,并在事件发生时更新组件的状态来显示消息。在组件卸载时,需要取消订阅事件以避免内存泄漏。

以上五种组件之间的通信方法,希望对大家有所帮助!

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

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

相关文章

Windows 共享文件 netlogon和sysvol的作用

在Windows域环境中&#xff0c;Netlogon和SYSVOL是两个非常重要的共享文件夹&#xff0c;它们由域控制器自动创建并管理&#xff0c;对于Active Directory&#xff08;AD&#xff09;域的正常运行至关重要&#xff1a; NETLOGON共享&#xff1a; 位置&#xff1a;\\<domain_…

牛客——扫雷MINE(dp,dfs,枚举+递推)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 相信大家都玩过扫雷的游戏。那是在一个n*m的矩阵里面有一些雷&#xff0c;要你根据一些信息找出雷来。 万圣节到了 &#xff0c;“余”人国流行起了一种简单的扫雷游戏&#xff0c;…

【BIAI】Lecture 9-Motor system 1

Motor System 专业词汇 skeletal muscle 骨骼肌 smooth muscle 平滑肌 cardiac muscle 心肌 flexor reflex 屈曲反射 central pattern generators 中央模式生成器 bio-inspired bipedal robots 仿生双足机器人 myotatic stretch reflex 肌肉自伸展反射 Cortex optic nerve 视皮…

web wifi配网和模式切换-esp8266和esp32

web wifi配网和模式切换-esp8266和esp32 支持模式:1:tcp client() 2:tcp server 3:http server(POST/GET) 4:http client 5:udp,6:factory,7:mqtt 配网进入方式&#xff1a; 开机&#xff0c;指示灯亮起后(需要灯闪烁3下后)&#xff0c;需在3s内&#xff08;超过3s则会正常启动…

NUXTJS安装始终报错无法正常运行问题解决

近日在了解NuxtJS&#xff0c;按照官方给出方法进行安装后&#xff0c;不是报错&#xff0c;就是安装成功后运行不了。执行npm run dev后始终运行出错&#xff0c;判断肯定是对应版本问题&#xff0c;沿着这方向研究&#xff0c;最终运行成功了。 文档地址&#xff1a;安装 - …

PyTorch动态计算图构建的详细过程和代码

当用户定义了一个继承自 nn.Module 的神经网络模型&#xff0c;并通过调用 model.forward(input) 进行前向传播时&#xff0c;PyTorch 会根据执行的张量操作序列自动构建并维护一个动态计算图&#xff0c;其中的详细过程是&#xff1a; 初始化输入&#xff1a; 用户首先准备输入…

WordPress可以做企业官网吗?如何用wordpress建公司网站?

我们在国内看到很多个人博客网站都是使用WordPress搭建&#xff0c;但是企业官网的相对少一些&#xff0c;那么WordPress可以做企业官网吗&#xff1f;如何用wordpress建公司网站呢&#xff1f;下面boke112百科就跟大家简单说一下。 WordPress是一款免费开源的内容管理系统&am…

python爬虫4

#1.练习 # &#xff08;1&#xff09; 获取网页的源码 # &#xff08;2&#xff09; 解析 解析的服务器响应的文件 etree.HTML # (3) 打印 import urllib.request urlhttps://www.baidu.com/ headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit…

Quartz定时任务Spring FrameWork整合

spring 版本是4.3.6 Quartz 整合spring Quarz Job类使用spring beanQuartz配置 quartz.properties Quarz Job类使用spring bean <!-- 调度工厂 --><bean id"schedulerFactoryBean" lazy-init"false" autowire"no" class"org.sp…

如何系统地自学 Python?

自学 Python 需要一个结构化的方法&#xff0c;以确保您覆盖所有基础知识并逐步提高到更高级的概念。以下是一个系统自学 Python 的步骤指南&#xff1a; 1. 理解 Python 的应用 在开始之前&#xff0c;了解 Python 能做什么&#xff1a;Web 开发&#xff08;如使用 Django 或…

RabbitMQ介绍及简单操作

文章目录 一、同步调用二、异步调用三、MQ介绍1.安装RabbitMQ2.介绍RabbitMQ3.页面简单使用 一、同步调用 例如&#xff1a; #mermaid-svg-DMjF9XQ1VKYd5FjK {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-DMjF9XQ…

[Angular 基础] - Angular 渲染过程 组件的创建

[Angular 基础] - Angular 渲染过程 & 组件的创建 之前的笔记为了推进度写的太笼统了&#xff08;只有功能没有其他&#xff09;&#xff0c;当时学的时候知道是什么东西&#xff0c;但是学完后重新复习发现有些内容就记不清了&#xff0c;所以重新用自己的语言总结一下 …

java中如何使用Lambda表达式(十一)

Lambda表达式如何支持默认方法 在Java 8中&#xff0c;引入了默认方法&#xff08;Default Methods&#xff09;的概念&#xff0c;这使得接口可以包含具有默认实现的方法。Lambda表达式可以与默认方法一起使用&#xff0c;以便在接口中提供一组默认的行为&#xff0c;并且可以…

IDEA常用快捷健

一、常用功能 Alt Shift F 显示添加到收藏夹弹出层 / 添加到收藏夹多行注释 ctrl shift /单行注释 ctrl /提示补全 (Class Name Completion) alt/执行(run) Shift F10复制代码 ctrl c 撤销 ctrl z反撤销 ctrl shift z剪切 ctrl x粘贴 ctrl v保存 ctrl s全选 ctrl…

被审查?ChatGPT陷入数据风波!

在近期的一项声明中&#xff0c;意大利的数据保护机构&#xff08;DPA&#xff09;对外宣布&#xff0c;他们已正式启动对OpenAI公司开发的聊天机器人ChatGPT的调查。该机构指出&#xff0c;ChatGPT违反了欧盟的通用数据保护条例&#xff08;GDPR&#xff09;&#xff0c;这一法…

Aigtek超声功率放大器的作用是什么

超声功率放大器是一种用于放大超声信号的设备&#xff0c;其作用是增强超声信号的功率&#xff0c;使其能够在超声应用中达到所需的强度和能量。下面西安安泰将详细解释超声功率放大器的作用以及其在不同领域的应用。 超声技术是通过利用超声波的高频振动传递和检测能量&#x…

springboot在线问诊系统-计算机毕业设计源码00211

摘 要 针对医院门诊等问题&#xff0c;对在线问诊进行研究分析&#xff0c;然后开发设计出在线问诊系统以解决问题。在线问诊系统主要功能模块包括首页、轮播图管理、公告信息管理、资源管理、系统用户管理&#xff08;管理员、患者用户、医生用户&#xff09;、模块管理&#…

从编程中理解:大脑的自我实现预言

在心理学中,自我实现预言(Self-fulfilling Prophecy)是指一个人的信念、期望或预测可以影响其行为和决策,进而使这个预言变为现实的现象。从编程的角度理解,这就像程序中的条件判断和循环结构,基于预设的条件执行不同的代码路径,最终导致预期的结果。 在Unity C#环境中…

node环境打包js,webpack和rollup两个打包工具打包,能支持vue

引言 项目中经常用到共用的js&#xff0c;这里就需要用到共用js打包&#xff0c;这篇文章讲解两种打包方式&#xff0c;webpack打包和rollup打包两种方式 1、webpack打包js 1.1 在根目录创建 webpack.config.js&#xff0c;配置如下 const path require(path); module.expo…

[激光原理与应用-74]:数据采集卡 - 数模转换芯片AD7606

目录 一、简介 二、AD7606 三、AD7606的管脚定义如下&#xff1a; 三、c主要接口寄存器 四、AD7606数据带宽 五、AD7606 六、AD7606的使用 一、AD7606简介 AD7606是一款由Analog Devices&#xff08;ADI&#xff09;公司生产的16通道高速模拟数字转换器&#xff08;ADC…