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

react组件通信方式

1. 父组件向子组件通信

// ParentComponent.js
import React from 'react';
import ChildComponent from './ChildComponent';function ParentComponent() {const message = 'Hello from parent!';return (<div><ChildComponent message={message} /></div>);
}export default ParentComponent;// ChildComponent.js
import React from 'react';function ChildComponent(props) {return (<div><p>{props.message}</p></div>);
}export default ChildComponent;

2. 子组件向父组件通信

// ParentComponent.js
import React, { useState } from 'react';
import ChildComponent from './ChildComponent';function ParentComponent() {const [message, setMessage] = useState('');const handleMessage = (msg) => {setMessage(msg);};return (<div><ChildComponent onMessage={handleMessage} /><p>Message from child: {message}</p></div>);
}export default ParentComponent;// ChildComponent.js
import React from 'react';function ChildComponent(props) {const sendMessage = () => {props.onMessage('Hello from child!');};return (<button onClick={sendMessage}>Send Message</button>);
}export default ChildComponent;

3. 跨级组件通信

// App.js
import React, { createContext, useContext } from 'react';
import GrandParentComponent from './GrandParentComponent';const MessageContext = createContext();function App() {return (<MessageContext.Provider value={'Hello from App!'}><GrandParentComponent /></MessageContext.Provider>);
}export default App;// GrandParentComponent.js
import React from 'react';
import ParentComponent from './ParentComponent';function GrandParentComponent() {return (<div><ParentComponent /></div>);
}export default GrandParentComponent;// ParentComponent.js
import React from 'react';
import ChildComponent from './ChildComponent';
import { MessageContext } from '../App';function ParentComponent() {const message = useContext(MessageContext);return (<div><ChildComponent message={message} /></div>);
}export default ParentComponent;// ChildComponent.js
import React from 'react';function ChildComponent(props) {return (<div><p>{props.message}</p></div>);
}export default ChildComponent;

4. 使用 Redux 进行全局状态管理

// store.js
import { createStore } from 'redux';const initialState = {message: '',
};function rootReducer(state = initialState, action) {switch (action.type) {case 'SET_MESSAGE':return { ...state, message: action.payload };default:return state;}
}const store = createStore(rootReducer);export default store;// App.js
import React from 'react';
import { Provider } from 'react-redux';
import store from './store';
import ComponentA from './ComponentA';function App() {return (<Provider store={store}><ComponentA /></Provider>);
}export default App;// ComponentA.js
import React, { useEffect } from 'react';
import { useSelector, useDispatch } from 'react-redux';function ComponentA() {const message = useSelector(state => state.message);const dispatch = useDispatch();useEffect(() => {dispatch({ type: 'SET_MESSAGE', payload: 'Hello from ComponentA!' });}, []);return (<div><p>{message}</p></div>);
}export default ComponentA;// ComponentB.js
import React, { useEffect } from 'react';
import { useSelector, useDispatch } from 'react-redux';function ComponentB() {const message = useSelector(state => state.message);return (<div><p>{message}</p></div>);
}export default ComponentB;

5. 使用 Refs 进行组件间通信

// ParentComponent.js
import React, { useRef } from 'react';
import ChildComponent from './ChildComponent';function ParentComponent() {const childRef = useRef(null);const triggerMethod = () => {childRef.current.childMethod();};return (<div><button onClick={triggerMethod}>Trigger Child Method</button><ChildComponent ref={childRef} /></div>);
}export default ParentComponent;// ChildComponent.js
import React from 'react';class ChildComponent extends React.Component {childMethod = () => {console.log('Called from ParentComponent');};render() {return <div>Child Component</div>;}
}export default ChildComponent;

6. 使用 Event Emitters 进行组件间通信

// EventEmitter.js
import Emitter from 'tiny-emitter/instance';const eventEmitter = new Emitter();export default eventEmitter;// ComponentC.js
import React, { useEffect } from 'react';
import eventEmitter from './EventEmitter';function ComponentC() {useEffect(() => {const handleEvent = (data) => {console.log('Received data:', data);};eventEmitter.on('my-event', handleEvent);return () => {eventEmitter.off('my-event', handleEvent);};}, []);return <div>Component C</div>;
}export default ComponentC;// ComponentD.js
import React, { useEffect } from 'react';
import eventEmitter from './EventEmitter';function ComponentD() {useEffect(() => {eventEmitter.emit('my-event', 'Hello from ComponentD!');}, []);return <div>Component D</div>;
}export default ComponentD;

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【简单介绍Gitea】
  • 记一次因为在html两个地方引入vue.js导致组件注入失败的问题
  • 算法基础课--学习--第一章
  • 深度学习:如何计算感受野
  • “微软蓝屏”事件,给IT行业带来的宝贵经验和教训
  • Leetcode49. 字母异位词分组(java实现)
  • PHP表单验证邮件和URL
  • PHP数组排序教程
  • C# 抽象工厂模式
  • Servlet2-HTTP协议、HttpServletRequest类、HttpServletResponse类
  • 当全球银行系统“崩溃”时会发生什么?
  • RocketMQ的详细讲解(四种mq的对比(activeMq、rabbitmq、rocketmq、kafka))
  • 【Android】广播机制
  • 密码暴力破解漏洞2024.7.26
  • AI变现:科技与商业化的交织
  • 10个最佳ES6特性 ES7与ES8的特性
  • exif信息对照
  • JavaScript函数式编程(一)
  • leetcode-27. Remove Element
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • node学习系列之简单文件上传
  • PHP的Ev教程三(Periodic watcher)
  • Yeoman_Bower_Grunt
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 后端_ThinkPHP5
  • 力扣(LeetCode)22
  • 前端之React实战:创建跨平台的项目架构
  • 微信开源mars源码分析1—上层samples分析
  • 在weex里面使用chart图表
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • scrapy中间件源码分析及常用中间件大全
  • 从如何停掉 Promise 链说起
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​决定德拉瓦州地区版图的关键历史事件
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • #pragma once
  • #每天一道面试题# 什么是MySQL的回表查询
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (6)添加vue-cookie
  • (Python) SOAP Web Service (HTTP POST)
  • (zt)最盛行的警世狂言(爆笑)
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (贪心 + 双指针) LeetCode 455. 分发饼干
  • (五)Python 垃圾回收机制
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)nsfocus-绿盟科技笔试题目
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .NET Reactor简单使用教程
  • .net 调用php,php 调用.net com组件 --
  • .Net 应用中使用dot trace进行性能诊断