React redux 兄弟组件之间通信
做项目的时候遇到一个场景,兄弟组件A和B,在组件B中的点击事件里面需要操作A组件的state,进行A组件里的tab标签增加和删除。因为用到redux,所以需要把这个state的数据抽出来做状态管理,随手记录一下。
- 新建action.js文件
export const CHANGE_ADDTABS = 'CHANGE_ADDTABS'; // 增加标签
export const CHANGE_DELETETABS = 'CHANGE_DELETETABS'; // 删除标签// 增加tab标签
export const changeAddTabs = (tab) => ({type: CHANGE_ADDTABS,tab
});// 删除tab标签
export const changeDeleteTab = (tabkey) => ({type: CHANGE_DELETETABS,tabkey //要删除标签的key值
});
2.store.js文件
import { createStore, combineReducers } from 'redux';
import { composeWithDevTools } from 'redux-devtools-extension';
import { persistStore, persistReducer } from 'redux-persist';
import storage from 'redux-persist/lib/storage/session';
import changeTabstate from '../reducer/index'; //这里是相对路径,是从reducer.js中引入const persistConfig = {key: 'root',storage
};// reducer,后面还有别的状态管理也可以放进去
const reducer = combineReducers({changeTabstate ,
});//直接照抄
const persistedReducer = persistReducer(persistConfig, reducer);
export default () => {let store = createStore(persistedReducer, composeWithDevTools());let persistor = persistStore(store);return { store, persistor };
};
3.reducer.js文件
//从action.js中引入两个常量
import { CHANGE_ADDTABS, CHANGE_DELETETABS } from '../../actions/action'; //定义初始数据(A组件的state),需求是初始页面中默认有3个tab
const initState = {activeTab: '0', //表示当前处于active状态的tabaddTabs: [{ title: 'tab1', closable: false, key: '0' },{ title: 'tab2', closable: false, key: '1' },{ title: 'tab3', closable: false, key: '2' }]
};// 增加tab(参数1:tab数据,参数2:新增的那条tab数据)
const changeAddTabs = (state, tab) => {let tabList = state.addTabs;tabList.push(tab);//返回新的state(这里注意要使用解构赋值,不然操作之后页面需要刷新才会更新)return {...state,addTabs: [ ...tabList ]};
};// 删除标签(参数1:tab数据,参数2:要删除的tab的key值)
const changeDeleteTabs = (state, tabkey) => {let tabList = state.addTabs;//删除逻辑let newTabList = tabList.filter((pane) => pane.key !== tabkey);//最后还是要返回一个新的statereturn {...state,addTabs: [ ...newTabList ]};
};//最后将增加和删除的操作return出去
export default (state = initState, action) => {switch (action.type) { //type对应action中定义的typecase CHANGE_ADDTABS:return changeAddTabs(state, action.tab);case CHANGE_DELETETABS:return changeDeleteTabs(state, action.tabkey);default:return state;}
};
4.兄弟组件B
import React from 'react';
//这两个一定要引入
import { connect } from 'react-redux';
import { changeAddTabs, changeActiveKey } from '../../../../redux/action/action';//这里用的react新的hook写法,和以前的class差不多
const BortherB= (props) => {//B组件的点击事件,此时可以操作A组件的stateconst clickAddTAbs = () => {//在props中直接拿到方法调用,这个addTabs方法名就是最后面mapDispatchToProps中定义的名字props.addTabs(); }return (<div>.....</div>);
}
//从reducer中获取初始值,props.tabList就可以直接拿
const mapStateToProps = (state) => ({//changeTabstate和store.js中定义的changeTabstate对应tabList: state.changeTabstate.addTabs, //addTabs和reducer.js中的初始数据字段addTabs对应 active: state.changeTabstate.activeTab//activeTab和reducer.js中的初始数据字段activeTab对应
});//将增加和删除的方法注入到props中,页面中就可以直接调用
const mapDispatchToProps = {addTabs: changeAddTabs,deleteTabs: changeDeleteTabs
};//最后connect一下
export default connect(mapStateToProps, mapDispatchToProps)(BortherB);
5.兄弟组件A
组件A和组件B的写法一样,下面这些都需要,头部的依赖也要引入,初始数据和方法按需加进来就好
新手入门,如果有不对的,请大家指正,感谢。
React redux 兄弟组件之间通信相关推荐
- React兄弟组件之间通信
兄弟组件之间通信 React是只有单项数据流动模式,也就是只能父组件的数据传递给子组件,而没有办法将子组件的数据传递给父组件.那么如果想要两个子兄弟组件通信该怎么办呢? 答案是可以通过子组件向父组件推 ...
- VUE 父子组件、兄弟组件 之间通信 最强详解
目录 1. 父组件 调用 子组件 内参数/方法 1.1 通过 ref 调用/获取 子组件内参数/方法 2. 子组件 调用 父组件 内参数/方法 2.1 通过 emit 调用 父组件方法 2.2 通过 ...
- 「后端小伙伴来学前端了」Vue中利用全局事件总线实现组件之间通信
月亮啊月亮 你能照见南边,也能照见北边 照见她,你跟她说一声,就说我想她了. 前言 前一篇文章写了 vue 中利用 Props 实现组件之间的通信,那种方式是最简单也是最基础的组件之间的通信方式.父组 ...
- React(5)React兄弟组件之间的通信
文章目录 前言 一.兄弟组件之间的通信原理 二.三个组件的基本结构 1.子组件ColorSelector的基本结构 2.子组件ColorBoard的基本结构 3.父组件Color的基本结构 三.Col ...
- react 显示隐藏组件的方法_10种React组件之间通信的方法
来源 | https://segmentfault.com/a/1190000023585646 这两天被临时抽调到别的项目组去做一个小项目的迭代.这个项目前端是用React,只是个小型项目所以并没有 ...
- react兄弟组件之间的传值
react兄弟组件之间的传值 一.通过redux 1.在redux中找到对应的文件设置 a. b. c. d. 2.页面存储数据到redux中 3.页面提取redux里面的数据 二.通过hook中的c ...
- [react] react兄弟组件如何通信?
[react] react兄弟组件如何通信? 状态提升,通过父组件的state和方法传递到两个子组件 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起讨论 ...
- React学习:组件之间的关系、参数传递-学习笔记
文章目录 React学习:组件之间的关系.参数传递-学习笔记 父到子传递参数 子-父 父-孙 兄弟组件传参 React学习:组件之间的关系.参数传递-学习笔记 父到子传递参数 <!DOCTYPE ...
- [react] react非父子组件如何通信?
[react] react非父子组件如何通信? redux context 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起讨论 主目录 与歌谣一起通关前端 ...
最新文章
- asp创建mysql表_asp创建数据库表
- UT斯达康XV6700上网终极设置
- Linux 磁盘分区、格式化、目录挂载
- paddlepaddle-VisualDL2.0对项目进行可视化调参
- JavaScript中的正则
- C++笔记-const与mutable、static_cast与reinterpret_cast
- php运行的四个黄金组合,PHP168与Phpwind强势整合 打造黄金组合
- 密码学原理与实践_到底什么是防火墙入侵检测密码学身份认证?如何高效建立网络安全知识体系?...
- 《面向对象的思考过程(原书第4版)》一 第2章 如何以面向对象的方式进行思考...
- 坚守普惠 AI,看华为云如何让 AI 落地!
- 字节跳动面试必问:kafkagroupid数目
- ubuntu终端连接远程计算机
- uml的图与代码的转换——类图
- python之 模块与包
- js正则表达式语法大全
- Java 8 stream的使用示例
- java eclipse改名_Java EE更名Jakarta EE,但Oracle还给Eclipse基金会提了很多要求 - IT之家...
- Excel表格自动汇总,sheet搬迁,数据汇总,多个工作簿、多个sheet页内数据汇总
- 《车载图像采集仿真应用指南》之基于图像采集的座舱测试
- PDF如何修改,PDF怎么删除其中一页
热门文章
- 红米3s进不了recovery_红米 3S英文版Recovery使用教程
- 基于Nastran的能量有限元方法(EFEA)介绍
- C4D样条点插值都是些什么意思?
- StringFog插件对Dex字符串加密原理解析
- Web安全知识体系总结
- uniapp 添加到“用其他应用打开”中,用于文件传递、分享等 Ba-ShareReceive
- 智能驾驶是什么意思_今天聊聊L2级别自动驾驶到底是个什么鬼?
- 天河超算大会2018-12-15
- WebGL入门(十九)-三维视图通过调整正射投影矩阵/盒状可视空间实现三角形的显示与消失
- 人才篇-如何识人用人