做项目的时候遇到一个场景,兄弟组件A和B,在组件B中的点击事件里面需要操作A组件的state,进行A组件里的tab标签增加和删除。因为用到redux,所以需要把这个state的数据抽出来做状态管理,随手记录一下。

  1. 新建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 兄弟组件之间通信相关推荐

  1. React兄弟组件之间通信

    兄弟组件之间通信 React是只有单项数据流动模式,也就是只能父组件的数据传递给子组件,而没有办法将子组件的数据传递给父组件.那么如果想要两个子兄弟组件通信该怎么办呢? 答案是可以通过子组件向父组件推 ...

  2. VUE 父子组件、兄弟组件 之间通信 最强详解

    目录 1. 父组件 调用 子组件 内参数/方法 1.1 通过 ref 调用/获取 子组件内参数/方法 2. 子组件 调用 父组件 内参数/方法 2.1 通过 emit 调用 父组件方法 2.2 通过  ...

  3. 「后端小伙伴来学前端了」Vue中利用全局事件总线实现组件之间通信

    月亮啊月亮 你能照见南边,也能照见北边 照见她,你跟她说一声,就说我想她了. 前言 前一篇文章写了 vue 中利用 Props 实现组件之间的通信,那种方式是最简单也是最基础的组件之间的通信方式.父组 ...

  4. React(5)React兄弟组件之间的通信

    文章目录 前言 一.兄弟组件之间的通信原理 二.三个组件的基本结构 1.子组件ColorSelector的基本结构 2.子组件ColorBoard的基本结构 3.父组件Color的基本结构 三.Col ...

  5. react 显示隐藏组件的方法_10种React组件之间通信的方法

    来源 | https://segmentfault.com/a/1190000023585646 这两天被临时抽调到别的项目组去做一个小项目的迭代.这个项目前端是用React,只是个小型项目所以并没有 ...

  6. react兄弟组件之间的传值

    react兄弟组件之间的传值 一.通过redux 1.在redux中找到对应的文件设置 a. b. c. d. 2.页面存储数据到redux中 3.页面提取redux里面的数据 二.通过hook中的c ...

  7. [react] react兄弟组件如何通信?

    [react] react兄弟组件如何通信? 状态提升,通过父组件的state和方法传递到两个子组件 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起讨论 ...

  8. React学习:组件之间的关系、参数传递-学习笔记

    文章目录 React学习:组件之间的关系.参数传递-学习笔记 父到子传递参数 子-父 父-孙 兄弟组件传参 React学习:组件之间的关系.参数传递-学习笔记 父到子传递参数 <!DOCTYPE ...

  9. [react] react非父子组件如何通信?

    [react] react非父子组件如何通信? redux context 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起讨论 主目录 与歌谣一起通关前端 ...

最新文章

  1. asp创建mysql表_asp创建数据库表
  2. UT斯达康XV6700上网终极设置
  3. Linux 磁盘分区、格式化、目录挂载
  4. paddlepaddle-VisualDL2.0对项目进行可视化调参
  5. JavaScript中的正则
  6. C++笔记-const与mutable、static_cast与reinterpret_cast
  7. php运行的四个黄金组合,PHP168与Phpwind强势整合 打造黄金组合
  8. 密码学原理与实践_到底什么是防火墙入侵检测密码学身份认证?如何高效建立网络安全知识体系?...
  9. 《面向对象的思考过程(原书第4版)》一 第2章 如何以面向对象的方式进行思考...
  10. 坚守普惠 AI,看华为云如何让 AI 落地!
  11. 字节跳动面试必问:kafkagroupid数目
  12. ubuntu终端连接远程计算机
  13. uml的图与代码的转换——类图
  14. python之 模块与包
  15. js正则表达式语法大全
  16. Java 8 stream的使用示例
  17. java eclipse改名_Java EE更名Jakarta EE,但Oracle还给Eclipse基金会提了很多要求 - IT之家...
  18. Excel表格自动汇总,sheet搬迁,数据汇总,多个工作簿、多个sheet页内数据汇总
  19. 《车载图像采集仿真应用指南》之基于图像采集的座舱测试
  20. PDF如何修改,PDF怎么删除其中一页

热门文章

  1. 红米3s进不了recovery_红米 3S英文版Recovery使用教程
  2. 基于Nastran的能量有限元方法(EFEA)介绍
  3. C4D样条点插值都是些什么意思?
  4. StringFog插件对Dex字符串加密原理解析
  5. Web安全知识体系总结
  6. uniapp 添加到“用其他应用打开”中,用于文件传递、分享等 Ba-ShareReceive
  7. 智能驾驶是什么意思_今天聊聊L2级别自动驾驶到底是个什么鬼?
  8. 天河超算大会2018-12-15
  9. WebGL入门(十九)-三维视图通过调整正射投影矩阵/盒状可视空间实现三角形的显示与消失
  10. 人才篇-如何识人用人