Redux

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。

可以让你构建一致化的应用,运行于不同的环境(客户端、服务器、原生应用),并且易于测试。

不仅于此,它还提供 超爽的开发体验,比如有一个时间旅行调试器可以编辑后实时预览。

Redux 除了和 React 一起用外,还支持其它界面库。 它体小精悍(只有2kB,包括依赖)。

  • 英文原版:http://redux.js.org/
  • Redux 中文文档: https://cn.redux.js.org/
  • Redux 中文文档:https://www.redux.org.cn/

Redux Flow

三大原则

同步

官网地址:https://cn.redux.js.org/tutorials/essentials/part-1-overview-concepts

异步

官网地址:https://cn.redux.js.org/tutorials/essentials/part-5-async-logic

查看原图

react中使用redux

我们使用redux处理一个问题,点击按钮,实现左侧导航的展开与闭合,如下图:

查询文档,可知:点击按钮,修改Sider容器的collapsed属性为true,即可满足要求。

但是,由于头部部分按钮和改Sider容器不在一个组件,故此,就出现了兄弟组件的通信问题

安装组件

安装 reduxreact-redux

yarn add redux react-redux

创建redux文件夹及其他文件

创建的目录如下:

创建store

在redux文件夹下面,新建store.js用于创建store

import { createStore } from 'redux'
import { SidebarCollapsedReducers } from "./reducers/SidebarCollapsedReducers"; let store = createStore(SidebarCollapsedReducers)

我们在项目中,不可能只有一个Reducer。

随着应用变得越来越复杂,可以考虑将 reducer 函数 拆分成多个单独的函数,拆分后的每个函数负责独立管理 state 的一部分。

所以,我们还会用到一个api-- combineReducers

combineReducers 辅助函数的作用是,把一个由多个不同 reducer 函数作为 value 的 object,合并成一个最终的 reducer 函数,然后就可以对这个 reducer 调用 createStore 方法。

合并后的 reducer 可以调用各个子 reducer,并把它们返回的结果合并成一个 state 对象。

由 combineReducers() 返回的 state 对象,会将传入的每个 reducer 返回的 state 按其传递给 combineReducers() 时对应的 key 进行命名。

示例

rootReducer = combineReducers({potato: potatoReducer, tomato: tomatoReducer})
// 这将返回如下的 state 对象
{potato: {// ... potatoes, 和一些其他由 potatoReducer 管理的 state 对象 ...},tomato: {// ... tomatoes, 和一些其他由 tomatoReducer 管理的 state 对象,比如说 sauce 属性 ...}
}

combineReducers

const reducer = combineReducers({SidebarCollapsedReducers,
});

改进store

import { createStore, combineReducers } from "redux";
import { SidebarCollapsedReducers } from "./reducers/SidebarCollapsedReducers"; // 导入 SidebarCollapsedReducersconst reducer = combineReducers({SidebarCollapsedReducers,
});
const store = createStore(reducer);export default store;

改进根组件

原先app.js

import IndexRouter from './router/IndexRouter'
import './App.css'
function App(){return <IndexRouter></IndexRouter>}
export default App

引入 react-redux

改进app.js

import IndexRouter from './router/IndexRouter'
import {Provider} from 'react-redux'
import './App.css'
import store from './redux/store'
function App(){return <Provider store={store}> <IndexRouter></IndexRouter></Provider>
}
export default App

组件中使用

此功能涉及到两个组件:

  • TopHeader.js – 点击按钮部分 ,发布者
  • SideMenu.js – 订阅者

如下图

改造 TopHeader.js组件

// TopHeader.jsexport default function TopHeader({ pageTitle }) {
// 其他代码
};

引入 react-redux,改进TopHeader.js

补充:connect()

react-redux 提供connect方法,用于从 UI 组件生成容器组件。connect的意思,就是将这两种组件连起来。

connect(mapStateToPropsmapDispatchToProps
)(被包装的组件)
  • mapStateToProps

将state映射到 UI 组件的参数(props)。 const mapStateToProps =state=> state;

  • mapDispatchToProps

将用户对 UI 组件的操作映射成 Action。

const  mapDispatchToProps = (dispatch)=>{    return {        'Increment':()=> dispatch(IncrementAction({})),        'Decrement':() => dispatch(DecrementAction({})),    }
}

改进TopHeader.js

import {connect} from 'react-redux'function TopHeader({ pageTitle }) {const changeCollapsed = ()=>{// 改变state的状态 props.changeCollapsed() }// 其他代码return <button  onClick={()=>changeCollapsed()}>操作</button>
};const mapStateToProps = (state, ownProps) => { return {isCollapsed: state.SidebarCollapsedReducers.isCollapsed}
}const mapDispatchToProps = {changeCollapsed(){return {type: 'change_collapsed', }}
}  export default connect(mapStateToProps,mapDispatchToProps)(TopHeader);

同理,修改SideMenu.js

import {connect} from 'react-redux'function SideBar(props) { // 其他代码return <Sider collapsed={props.isCollapsed}></Sider> // 注意这里
};const mapStateToProps = (state, ownProps) => { return {isCollapsed: state.SidebarCollapsedReducers.isCollapsed}
}export default connect(mapStateToProps)(SideBar);

总结 – 全部代码

\redux\reducers\SidebarCollapsedReducers.js

export const SidebarCollapsedReducers = (prevState = {isCollapsed: false
}, action) => { switch (action.type) {case 'change_collapsed':let newState = {...prevState} // 注意这里newState.isCollapsed = !newState.isCollapsedreturn newStatedefault:return prevState}
};

\redux\store.js

import { createStore, combineReducers } from "redux";
import { SidebarCollapsedReducers } from "./reducers/SidebarCollapsedReducers"; // 导入 SidebarCollapsedReducersconst reducer = combineReducers({SidebarCollapsedReducers,
});
const store = createStore(reducer);export default store;

app.js

import IndexRouter from './router/IndexRouter'
import {Provider} from 'react-redux'
import './App.css'
import store from './redux/store'
function App(){return <Provider store={store}> <IndexRouter></IndexRouter></Provider>
}
export default App

组件

components\sandbox\TopHeader.js

import React, { useEffect, useState } from "react";
import { Layout} from "antd";
import { connect } from "react-redux";const { Header } = Layout;function TopHeader(props) {   const changeCollapsed = ()=>{// 改变state的状态// dispatchconsole.log(props)props.changeCollapsed() }return (<Header><div style={{ display: "flex" }}>{React.createElement(props.isCollapsed ? MenuUnfoldOutlined : MenuFoldOutlined,{className: styles.trigger,onClick: () => changeCollapsed()})} </div> </Header>);
}const mapStateToProps = (state, ownProps) => { return {isCollapsed: state.SidebarCollapsedReducers.isCollapsed}
}const mapDispatchToProps = {changeCollapsed(){return {type: 'change_collapsed', }}
}
export default connect(mapStateToProps,mapDispatchToProps)(TopHeader);

components\sandbox\SideMenu.js

import { useEffect, useState } from "react";
import { Layout, Menu } from "antd";
import { connect } from "react-redux";const { Sider } = Layout;function AppLayout(props) {  return ( <Sider trigger={null} collapsible collapsed={props.isCollapsed}> // 注意这里 props.isCollapsed<div className={styles.logo}> {siteBaseConfig.siteName} </div>... </Sider> );
}const mapStateToProps = (state, ownProps) => { return {isCollapsed: state.SidebarCollapsedReducers.isCollapsed}
} export default connect(mapStateToProps)(AppLayout);

参考文档

  • https://cn.redux.js.org/api/combinereducers

如何react中使用redux和react-redux相关推荐

  1. react中使用angular组件,react中使用定时器

    react native 可以使用typescript开发吗 最近在公司正在用Spacemacs+TypeScript写ReactNative.总体来讲依靠各种补全和纠错,效率还是比不用TypeScr ...

  2. mobx在react中应用_借助React Native Elements,Jest和MobX MST可以轻松实现现实世界中的ReactNative应用...

    mobx在react中应用 by Qaiser Abbas 由Qaiser Abbas 借助React Native Elements,Jest和MobX MST可以轻松实现现实世界中的ReactNa ...

  3. React中遇到的bug——React数组push后作为table数据无法显示

    错误展示 上面一张图表格数据源是push的数组,下面图片是正常数据源 错误代码 state中的 // 暂存所有数据arr: [],alldata: {pages: 0,total: 0,current ...

  4. 在React中获取数据

    React初学者经常从不需要获取数据的应用开始.他们经常面临一个计数器,任务列表获取井字棋游戏应用.这是很好的,因为在开始学习React的时候,数据获取在你的应用中添加了另一层复杂度. 然而,有些时候 ...

  5. React中pros和state的区别

    props是一个父组件传递给子组件的数据流,这个数据流可以一直传递到子孙组件. state代表的是一个组件内部自身的状态(可以是父组件.子孙组件). state 和 props 主要的区别在于 pro ...

  6. echarts setoption方法_在Vue和React中使用ECharts的多种方法

    前言 俗话说:"工欲善其事,必先利其器".现如今已经有许多成熟易用的可视化解决方案,例如ECharts,AntV等等.我们可以把这些解决方案比作是一套套成熟的"工具&qu ...

  7. this指向、数据双向流、传递参数、JSX中循环、React中样式、路由、引入资源的其它方式、create-react-app脚手架、事件处理、获取数据、UI框架推荐、pc桌面应用electronjs

    改变this指向的几种方式: //1.使用箭头函数代替原始函数写法:getState=()=>{}//2.在函数调用时给函数名加bind(this)方法:(bind中第一个参数表示修改this指 ...

  8. React中的合成事件

    React中的合成事件 React自己实现了一套高效的事件注册.存储.分发和重用逻辑,在DOM事件体系基础上做了很大改进,减少了内存消耗,简化了事件逻辑,并最大程度地解决了IE等浏览器的不兼容问题. ...

  9. React中的纯组件

    React中的纯组件 React提供了一种基于浅比较模式来确定是否应该重新渲染组件的类React.PureComponent,通常只需要继承React.PureComponent就可以定义一个纯组件. ...

  10. React 中的虚拟 DOM 是什么?

    虚拟 DOM 是一个基本的 React 概念.如果您在过去几年编写过 React 代码,您可能听说过它.但是,你可能不明白它是如何工作的以及 React 为何使用它. 本文将介绍什么是虚拟 DOM,它 ...

最新文章

  1. SpringMVC注解@initbinder解决类型转换问题
  2. Android中对APK进行反编译
  3. 中奖名单 | 价值 199 的大数据平台研发课程幸运er
  4. C#——《C#语言程序设计》实验报告——泛型与集合——运算符重载
  5. boost::hana::trait用法的测试程序
  6. 性能优化篇(5):css 内部 or 外部,该如何选择?
  7. Your Potential. Our Passion
  8. 美国道富java开发面试题_从事Java开发五年,面试9家拿到7家offer,1096面试+67笔试题...
  9. 云服务器的主要用途是什么?
  10. 色彩配色基础泛谈《第一天》到底说了麻?
  11. 数据库报duplicate XXX entry for key primary错误的可能原因以及解决方法
  12. 整合+策略:微网通联的GMP平台如何帮助企业搭建统一智慧通信架构
  13. c#语言小括号里面的逗号是什么意思
  14. 打开Xmind提示The contiolrator Userslwangappication DatalXMindlconfiquration-cathy win32-R3.79.2019120523
  15. 汉字 字库压缩ttf
  16. 十多个巨头App上可跑智能小程序了
  17. istio 实战 六 全链路监控 - Jaeger
  18. 互联网产品的定义及分类
  19. fatal error C1189: #error : WRL requires NTDDI_VERSION to be #defined at least
  20. 考研英语阅读理解做题技巧(2):主旨题

热门文章

  1. 【C语言】通讯录(文件版)
  2. R语言非参数检验多重比较
  3. CTRL+C复制和CTRL+V粘贴键不能使用的解决办法
  4. A-the Beatles
  5. ABAQUS中Cohesive粘聚力模型的2种定义方式(附案例操作步骤)
  6. 鲁棒优化入门(二)——基于matlab+yalmip求解鲁棒优化问题
  7. APS软件必须满足不同规划要求
  8. ArcGIS 基于TIN地表面数据和建筑数据进行视域分析
  9. vant 自义定 tabBar 图标和颜色
  10. 在 Android 中执行 Linux 终端命令