如何react中使用redux和react-redux
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
容器不在一个组件,故此,就出现了兄弟组件的通信问题。
安装组件
安装 redux
和 react-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相关推荐
- react中使用angular组件,react中使用定时器
react native 可以使用typescript开发吗 最近在公司正在用Spacemacs+TypeScript写ReactNative.总体来讲依靠各种补全和纠错,效率还是比不用TypeScr ...
- mobx在react中应用_借助React Native Elements,Jest和MobX MST可以轻松实现现实世界中的ReactNative应用...
mobx在react中应用 by Qaiser Abbas 由Qaiser Abbas 借助React Native Elements,Jest和MobX MST可以轻松实现现实世界中的ReactNa ...
- React中遇到的bug——React数组push后作为table数据无法显示
错误展示 上面一张图表格数据源是push的数组,下面图片是正常数据源 错误代码 state中的 // 暂存所有数据arr: [],alldata: {pages: 0,total: 0,current ...
- 在React中获取数据
React初学者经常从不需要获取数据的应用开始.他们经常面临一个计数器,任务列表获取井字棋游戏应用.这是很好的,因为在开始学习React的时候,数据获取在你的应用中添加了另一层复杂度. 然而,有些时候 ...
- React中pros和state的区别
props是一个父组件传递给子组件的数据流,这个数据流可以一直传递到子孙组件. state代表的是一个组件内部自身的状态(可以是父组件.子孙组件). state 和 props 主要的区别在于 pro ...
- echarts setoption方法_在Vue和React中使用ECharts的多种方法
前言 俗话说:"工欲善其事,必先利其器".现如今已经有许多成熟易用的可视化解决方案,例如ECharts,AntV等等.我们可以把这些解决方案比作是一套套成熟的"工具&qu ...
- this指向、数据双向流、传递参数、JSX中循环、React中样式、路由、引入资源的其它方式、create-react-app脚手架、事件处理、获取数据、UI框架推荐、pc桌面应用electronjs
改变this指向的几种方式: //1.使用箭头函数代替原始函数写法:getState=()=>{}//2.在函数调用时给函数名加bind(this)方法:(bind中第一个参数表示修改this指 ...
- React中的合成事件
React中的合成事件 React自己实现了一套高效的事件注册.存储.分发和重用逻辑,在DOM事件体系基础上做了很大改进,减少了内存消耗,简化了事件逻辑,并最大程度地解决了IE等浏览器的不兼容问题. ...
- React中的纯组件
React中的纯组件 React提供了一种基于浅比较模式来确定是否应该重新渲染组件的类React.PureComponent,通常只需要继承React.PureComponent就可以定义一个纯组件. ...
- React 中的虚拟 DOM 是什么?
虚拟 DOM 是一个基本的 React 概念.如果您在过去几年编写过 React 代码,您可能听说过它.但是,你可能不明白它是如何工作的以及 React 为何使用它. 本文将介绍什么是虚拟 DOM,它 ...
最新文章
- SpringMVC注解@initbinder解决类型转换问题
- Android中对APK进行反编译
- 中奖名单 | 价值 199 的大数据平台研发课程幸运er
- C#——《C#语言程序设计》实验报告——泛型与集合——运算符重载
- boost::hana::trait用法的测试程序
- 性能优化篇(5):css 内部 or 外部,该如何选择?
- Your Potential. Our Passion
- 美国道富java开发面试题_从事Java开发五年,面试9家拿到7家offer,1096面试+67笔试题...
- 云服务器的主要用途是什么?
- 色彩配色基础泛谈《第一天》到底说了麻?
- 数据库报duplicate XXX entry for key primary错误的可能原因以及解决方法
- 整合+策略:微网通联的GMP平台如何帮助企业搭建统一智慧通信架构
- c#语言小括号里面的逗号是什么意思
- 打开Xmind提示The contiolrator Userslwangappication DatalXMindlconfiquration-cathy win32-R3.79.2019120523
- 汉字 字库压缩ttf
- 十多个巨头App上可跑智能小程序了
- istio 实战 六 全链路监控 - Jaeger
- 互联网产品的定义及分类
- fatal error C1189: #error : WRL requires NTDDI_VERSION to be #defined at least
- 考研英语阅读理解做题技巧(2):主旨题