前言

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

首先明确一点的就是:

Redux并不是React必须的,也没有任何依赖,你可以很自由的将他应用到各种前端框架、jQuery、原生JS中,它只是一个数据流管理工具。

了解一下React的数据流:

  • React推崇的是单向数据流,自上而下进行数据传递。
  • 父组件可以通过Props将数据传给子组件。
  • 子组件可以通过回调函数来将数据传递到父组件。
  • 多级嵌套组件可以通过getChildContext来传递,这样避免的使用props来进行多级传递,需要接受数据的子组件通过this.context可以获取到

下面一张图可能会比较清楚直观:

Redux的基本原则

       1.唯一数据源 应用的状态数据应该只存储在唯一的一个Store上,即 State 树。
       2.保存状态只读 不能直接修改state的值,必须通过派发action对象完成。通过getState()获取值
       3.数据改变只能通过纯函数 这里的纯函数就是reducer,函数的返回结果必须有两个参数stateaction决定

store

Redux 应用只有一个单一的 store (不同于Flux)。它是数据管理中心。

action

action 是一个带有type的对象,dispatch一个action是改变state的唯一法门,代表着发生了一些事情。

reducer

是一个纯函数。

Action 只是描述了有事情发生了这一事实,并没有指明应用如何更新 state。而这正是 reducer 要做的事情。(preState,action)=> newState

永远不要在reducer里做这些操作

  • 修改传入参数;
  • 执行有副作用的操作,如 API 请求和路由跳转;
  • 调用非纯函数,如 Date.now() 或 Math.random()

根据业务逻辑可以分为很多个reducer,然后通过combineReducers将它们合并

const RootReducer = combineReducers({
movies,
books
})
  • getState() 获取store中当前的状态。
  • dispatch(action) 分发一个action,并返回这个action。这是唯一能改变store中数据的方式,且触发listener的调用
  • subscribe(listener) 注册一个监听者,它在store发生变化的时候被调用
  • replaceReducer(nextReducer) 更新当前store里的reducer,一般只会在开发模式中调用该方法。

这些步骤都需要自己写

所以通常只用Redux的话,开发流程应该是这个样子的: component --> dispatch(actionCreater) --> reducer --> subscribe --> getState --> component

这样自己写会有点那个啥麻烦,接下来介绍下使用React-Redux了

React-Redux

react-redux是redux为结合react使用而造出来的一个工具库。

类似的还有vue-redux、angular-redux.... 简单到只提供了一个APi:connect,一个组件:Provider。

connect将组件与redux关联起来,

1. Provider将store传给组件。

2.组件通过dispatch发出action,store根据action的type属性调用对应的reducer并传入state和这个action,

3.reducer对state进行处理并返回一个新的state放入store,

4.connect监听到store发生变化,调用setState更新组件,此时组件的props也就跟着变化。

将组件和redux关联起来需要mapStateToProps,mapDispatchToProps 这两个函数作为参数。

通俗来讲:

  • mapStateToProps 就是用来绑定数据的,也就是说store返给了你所有的state,你在这个函数中,挑出当前组件所需的返回出来就可以了。
  • mapDispatchToProps 就是用来绑定事件的,将你需要在组件中调用的方法,在这里挑选出来。大多是可以触发dispatch(action)的方法。

下面用到这个方法:

function mapStateToProps(state) {
const {homeList, uploadAvatar} = state;
return {
homeList: homeList.list,
uploadAvatar: uploadAvatar
};
} function mapDispatchToProps(dispatch) {
return {
actions: bindActionCreators(actions, dispatch),
}
} const homeList = connect(mapStateToProps, mapDispatchToProps)(Home)

用官方的图更加好理解:

这样我们会发现使用的React-Redux的开发流程是这样的: component --> actionCreator(data) --> reducer --> component
   中间省去的store的操作都不需要我们手动去写了,React-Redux帮我们去做,方便了开发

redux-thunk

怎么去进行ajax请求啊!?只简单说一下怎么在action中使用。

这要归功于redux允许我们扩展其中间件,

普通的action是一个带有type的对象,在中间件中扩展了redux-thunk之后,

其允许我们在actionsCreater中返回一个带有dispatch的function。 这样我们可以在异步代码中调用dispatch(action)来改变state

项目总结

redux其实就是这么一个过程:

1、设计State,这是最重要的一步,他决定了你的action和reducer怎么写。

2、先写内容组件component,这一部分只是UI展示,不负责数据交流。

3、根据State来写actionCreater,thunk和普通的action区分开,导出thunk。

4、根据State来写reducer,按照state和模块将reducer分开,最后使用combineReducers合成一个总的Reducer。

5、整合store,根据Reducer和中间件来生成store。 6、现在根据component来写container,这一部分只负责数据、状态。

比较Vue重点vuex 还是比较高级一点的,其实理解了也就那么回事,你也不要太注意怎么去理解怎么实现这个过程,

这也就是硬性的规定(就好比9年义务教育)...多撸几遍就知道了,哈哈哈,加油吧 少年

Redux 聊聊的更多相关文章

  1. 【原创】Redux 卍解

    Redux 卍解 Redux - Flux设计模式的又一种实现形式. 说起Flux,笔者之前,曾写过一篇<ReFlux细说>的文章,重点对比讲述了Flux的另外两种实现形式:『Facebo ...

  2. React Redux Sever Rendering实战

    # React Redux Sever Rendering(Isomorphic JavaScript) ![React Redux Sever Rendering(Isomorphic)入门](ht ...

  3. 我的前端故事----关于redux的一些思考

    背景 我一个前端,今年第一份工作就是接手一个 APP 的开发...一个线下 BD 人员用的推广 APP,为了让我这个一天原生开发都没有学过的人能快速开发上线,于是乎就选择了 react-native ...

  4. [转]聊聊技术选型 - Angular2 vs Vue2

    转载:https://juejin.im/post/58cab85b44d9040069f38f7a "Come, and take choice of all my library, An ...

  5. Vuex、Flux、Redux、Redux-saga、Dva、MobX

    https://www.jqhtml.com/23003.html 这篇文章试着聊明白这一堆看起来挺复杂的东西.在聊之前,大家要始终记得一句话:一切前端概念,都是纸老虎. 不管是Vue,还是 Reac ...

  6. 理解Redux以及如何在项目中的使用

    今天我们来聊聊Redux,这篇文章是一个进阶的文章,建议大家先对redux的基础有一定的了解,在这里给大家推荐一下阮一峰老师的文章: http://www.ruanyifeng.com/blog/20 ...

  7. 聊聊技术选型 - Angular2 vs Vue2

    作者介绍:李旸,美团点评前端工程师,3 年 Web 前端开发经验,现在是美团点评点餐团队的一员. "Come, and take choice of all my library, And ...

  8. RxJS + Redux + React = Amazing!(译一)

    今天,我将Youtube上的<RxJS + Redux + React = Amazing!>翻译(+机译)了下来,以供国内的同学学习,英文听力好的同学可以直接看原版视频: https:/ ...

  9. 通过一个demo了解Redux

    TodoList小demo 效果展示 项目地址 (单向)数据流 数据流是我们的行为与响应的抽象:使用数据流能帮我们明确了行为对应的响应,这和react的状态可预测的思想是不谋而合的. 常见的数据流框架 ...

随机推荐

  1. samba安装应用实例-1

    应用实例:先安装samba软件,yum install -y samba1.需求:共享一个目录,任何人都可以访问,不用输密码,只读.(1)首先打开samba配置文件/etc/samba/smb.con ...

  2. nginx代理,负载均衡

    #代理,如:通过代理实现访问百度(单个机器)创建vim proxy.conf内容如下server { listen 80; server_name www.baidu.com; location / ...

  3. monkeyrunner初试

    Monkeyrunner学习心得 在网上下载并且配置好python,androidsdk和jdk的环境之后,在cmd中运行一下python,java -vesion和monkeyrunner,使之都可 ...

  4. Day02:变量 / JAVA基本类型

    变量 什么是变量? 变化数值的载体 变量声明.初始化.使用 声明变量  类型 大小(占用空间) int x; 初始化变量 (赋值) 给予占用空间 int x=35; 使用变量 直接使用变量名 注意: ...

  5. Mac_Navicat Premium连接MySQL错误2059 - Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(../Frameworks/caching_sha2_password.so, 2): image not found

    mac下MySql启动连接报错:Authentication plugin ‘caching_sha2_password’ cannot be loaded: dlopen(/usr/local/my ...

  6. 一本值得你反复研读的Python佳作《Python编程从0到1》

    现在的Python入门书太多太多了,究竟如何选择呢? 当然选最好的最入门的讲解最清晰的,没有那么多废话的. 现在就推荐一本<Python编程从0到1>,还带视频的,到时候跟大家一起学习沟通 ...

  7. 浅谈spring配置定时任务的几种方式

    网上看到好多关于定时任务的讲解,以前只简单使用过注解方式,今天项目中看到基于配置的方式实现定时任务,自己做个总结,作为备忘录吧. 基于注解方式的定时任务 首先spring-mvc.xml的配置文件中添 ...

  8. 【6.28校内test】T2 【音乐会】二重变革

    [音乐会]二重变革[题目链接] T2其实是一道数学题,因为你看: 2MB??一共就可以存下个int,然鹅再看数据范围: 那么大是稳稳的不是TLE就是MLE了,所以肯定是数学题,而且是只需要存很少数据的 ...

  9. C++中前置操作符和后置操作符的重载

    1,C 语言中讨论了原生含义,C++ 中有必要考虑前置.后置操作符能够重载,有何问题: 2,值得思考的问题: 1,下面的代码有没有区别?为什么? 1,i++  // i 的值作为返回值,i 自增 1: ...

  10. 手把手教你上传文件到GitHub上(已获取ssh密钥)

    如何提交一个文件到GitHub(已经生成ssh key) 1.新建一个文件夹,当作本地仓库 2.初始化仓库 $git init 3.将想要上传的东西复制到仓库中 4.将文件提交到暂存区 $git ad ...