动机

随着 JavaScript 单页应用开发日趋复杂,JavaScript 需要管理比任何时候都要多的 state (状态)。 这些 state 可能包括服务器响应、缓存数据、本地生成尚未持久化到服务器的数据,也包括 UI 状态,如激活的路由,被选中的标签,是否显示加载动效或者分页器等等。

三大原则

  • 单一数据源

整个应用的 state 被储存在一棵 object tree 中,并且这个 object tree 只存在于唯一一个 store 中。

  • State 是只读的

唯一改变 state 的方法就是触发 action,action 是一个用于描述已发生事件的普通对象。

  • 使用纯函数来执行修改

为了描述 action 如何改变 state tree ,你需要编写 reducers。

运用

下面,笔都运用一个简单的增加、减少的列子来解读 react-redux 神奇之处。

首先 react-cli 安装一个项目,这块步骤,网上很多教程,就不再继续累赘了。

  • 安装 redux 状态管理所需要的模块
npm i -D react-redux redux-thunk

这里解释一下,其实不涉及异步的的 state 状态,不需要 redux-thunk 中间件,这里我们选择带上,是因为一个应用项目肯定会涉及到异步请求。下面来跟着一步步的改造 脚手架生成的项目。(代码编辑器里加粗的是我们要改造的代码块)

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import 'antd/dist/antd.css'; // or 'antd/dist/antd.less'
import { Provider } from 'react-redux';
import Store from './store/index'const store = Store();ReactDOM.render(<Provider store={store}><React.StrictMode><App /></React.StrictMode></Provider>,document.getElementById('root')
);

store/index.js

import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import reducer from './reducer';const store = () => createStore(reducer, applyMiddleware(thunk));export default store;

reducer.js

const initialState = { count: 0 };
const reducer = (state = initialState, action) => {switch (action.type) {case 'ADD_CONST':return { count: state.count + 1 };case 'MINUS_CONST':return { count: state.count - 1 };default:return state;  }
}export default reducer;

actions.js

export const addConst = () => {return {type: 'ADD_CONST'}
}export const minusConst = () => {return {type: 'MINUS_CONST'}
}

CustomCount.js 组件

bindActionCreators 是 redux 的一个 API,作用是将单个或多个 ActionCreator 转化为 dispatch(action) 的函数集合形式。也可以不用 bindActionCreators,dispatch 也是可以的

react-redux的connect方法 接受4个参数

  1. mapStateToProps(state, [ownProps]) 接受完整的redux状态树作为参数,返回对象的所有key都会成为组件的props
  2. mapDispatchToProps(dispatch, [ownProps]) 接受redux的dispatch方法作为参数,返回当前组件相关部分的action creator并可以在这里将action creator与props绑定,减少冗余
  3. mergeProps(stateProps, dispatchProps, ownProps) 如果指定这个函数,你将分别获得 mapStateToProps、 mapDispatchToProps 返回值以及当前组件的props 作为参数,最终返回你期望的、完整的 props
  4. [options] : pure:true, 将为组件添加shouldComponentUpdate()声明周期函数;
  5. withRef:false, 若为true,为组件加一个ref值,后续可以使用 getWrappedInstance() 方法来获取该 ref
import React from 'react';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import * as countActions from '../store/action';class CustomCount extends React.Component {render() {const { count, actions } = this.props;return (<div><span>{count}</span><button onClick={actions.addConst}>+</button><button onClick={actions.minusConst}>-</button></div>)}
}const mapStateToProps = (state) => {return {count: state.count}
}const mapDispatchToProps = (dispatch) => {return {actions: bindActionCreators(countActions, dispatch)// actions: {//   addConst: () => dispatch(countActions.addConst()),//   minusConst: () => dispatch(countActions.minusConst())// }}
}export default connect(mapStateToProps,mapDispatchToProps
)(CustomCount);

react-saga

请移步:https://www.ifrontend.net/2021/07/redux-saga/

微信公众号搜索“前端开发那点事”

react、react-redux、redux-thunk、react-saga运用相关推荐

  1. React native 项目进阶(redux, redux saga, redux logger)

    之前利用知乎日报的api写了react-native的一个入门项目,传送文章地址React Native 项目入门和源码地址RN入门项目源码,目前github上的代码已经在原文的基础上增加了新的功能, ...

  2. Redux 学习总结 (React)

    在 React 的学习和开发中,如果 state (状态)变得复杂时(例如一个状态需要能够在多个 view 中使用和更新),使用 Redux 可以有效地管理 state,使 state tree 结构 ...

  3. React Native集成Redux框架讲解与应用

    学过React Native的都知道,RN的UI是根据相应组件的state进行render的,而页面又是由大大小小的组件构成,导致每个组件都必须维护自身的一套状态,因此当页面复杂化的时候,管理stat ...

  4. Flux -- Redux -- Redux React 基础实例教程

    本文的目的很简单,介绍Redux相关概念用法 及其在React项目中的基本使用 假设你会一些ES6.会一些React.有看过Redux相关的文章,这篇入门小文应该能帮助你理一下相关的知识 一般来说,推 ...

  5. react-redux图解_如何将React连接到Redux —图解指南

    react-redux图解 by Princiya 由Princiya 如何将React连接到Redux -图解指南 (How to connect React to Redux - a diagra ...

  6. [Redux/Mobx] 在React中你是怎么对异步方案进行选型的?

    [Redux/Mobx] 在React中你是怎么对异步方案进行选型的? 小项目使用简单的redux-thunk方案,增加的代码量极少,只有两个api,上手成本低 大项目使用基于redux-saga的d ...

  7. React Suspense提供Redux的替代方案

    React 16.6引入了Suspense,它能够在某些时候(比如通过API调用获取数据)暂停渲染并展现一个加载中的指示器. 在常见的简单场景中,React Suspense消除了使用Redux的必要 ...

  8. 如何react中使用redux和react-redux

    Redux Redux 是 JavaScript 状态容器,提供可预测化的状态管理. 可以让你构建一致化的应用,运行于不同的环境(客户端.服务器.原生应用),并且易于测试. 不仅于此,它还提供 超爽的 ...

  9. 【React+ts】从零开始搭建react函数式组件+router+redux+less+sass+axios反向代理+antd(保姆式教学)

    前提 你需要准备好node.js版本不低于6.14.8 和 git 文章内容比较长(保姆级别教程),全是干货,请耐心看完 通过create-react-app脚手架搭建项目 1.第一步 注: 项目名称 ...

  10. 【React+TS】从零开始搭建react+typescript+router+redux+less+px2rem自适应+sass+axios反向代理+别名@+Antd-mobile

    一.通过create-react-app脚手架创建项目 npx create-react-app testproject --template typescript 在vscode中打开项目,可以看到 ...

最新文章

  1. SVM原理详细图文教程来了!一行代码自动选择核函数
  2. 【译】Introduction to Byteball — Part 2: The DAG
  3. 机房系统(三)——【充值 退卡 】
  4. 【数据结构】(面试题)使用两个栈实现一个队列(详细介绍)
  5. asp.net mvc使用mysql_如何使用MySQL设置ASP.NET MVC 2?
  6. NUC1421 时间日期格式转换【日期计算】
  7. lintcode-111-爬楼梯
  8. 如何用PS制作1寸证件照
  9. macOS Ventura 正式版发布 苹果官方详解macOS 13 Ventura正式版
  10. Vue的MVVM框架
  11. 2022-2027年中国建筑施工机械租赁市场规模预测及投资战略咨询报告
  12. 自从收了这些Python库 头发都不脱了!
  13. Appium爬虫小案例
  14. 美赛数学建模 | 信息检索与竞赛工具 降低信息差
  15. CVPR2019 Oral论文《Side Window Filtering》解读及算法 Python 实现
  16. 杂记--企业网银B2B支付
  17. 苏州的计算机考研的,2014年苏州大学计算机考研经验
  18. 如何简单形象又有趣地讲解神经网络是什么?(知乎) 说的人很多,理解很充分
  19. 程序狗,未知的艰难讨薪路
  20. slf4j log4j 和 reload4j

热门文章

  1. linux系统ubuntu
  2. [内核内存] [arm64] 内存回收2---快速内存回收和直接内存回收
  3. python 培训基础
  4. java 比较两个字符串大小
  5. mysqladmin的用法简介
  6. VisualVM工具介绍
  7. with as的update写法
  8. e的近似求解方法matlab,3X^2-E^X并用matlab切线法求出所有实根的近似值,源程序
  9. 人工智能机器人是什么编程
  10. 【Linux】bert-base-cased 不在缓存需要从 s3 上下载的问题