什么是Redux?

  Redux能Javascript的状态管理变得更加可预期,Redux让你以一种新方式思考开发应用,这个方式是:状态从一个初始状态开始,被一系列动作序列改变,这种新方式是通往复杂Web应用的捷径。

  Redux激活各种工具如日志ogging热重加载hot reloading, 时间旅行time travel记录record 和重播replay更加容易方便,无需额外努力,也就是说,我们实现一些复杂功能如undo/redo变得非常容易。

与Flux比较

  Redux是对Flux的演进和改变,它们两者也有类似点: Redux虽然可以使得应用状态改变能更加可预期,但是如果你要改变状态,你还是得启动激活一个动作Action,没有其他办法直接改变状态,因为含有状态的组件只有一个getter方法,没有setter方法用来改变设置状态。

  在Flux中,你得有一个分发器dispatcher用来发送动作action到数据存储中,然后更新视图,这是一种单向数据流,不同于MVC的双向数据流(MVC也可以在视图中倒过来激活action),这种单向决定了一旦有更新只能用这么一种方式实现:

  Action --> Dispather ---> Store存储 --->视图

  这种one-way (单向)数据流的隐含缺点是,你的数据存储Store就不能被视图主动访问或联系,因为更新只能是先存储后视图,

  Redux是flux概念的子集,两者主要区别是:

  • 在Redux中没有dispatcher了,你直接监听者在Action动作中,当每次Action被激活需要dispatch时,使用一个函数称为reducer来返回新的应用状态。
  • Redux保留有你所有应用在一个地方,这样避免到处是可变状态,降低副作用。
  • 你的应用状态是不可变的

  想象一下你的应用状态如同一棵树,有各种根节点和子节点,如果你在子节点做一个改变,你不能直接去改变它,因为状态是不可变的,怎么办?你只能复制这个目标子节点,做一个拷贝复制,然后对这个复制品中状态进行改变,当然你也得复制子节点的父节点,因为父节点不会指导自己子节点会有两个版本,你也可以追加子节点到新节点,最后你需要将原来存在未改变状态的节点附加到新节点上,下图蓝色是旧节点,红色是新节点:

 

  这样,原始节点蓝色部分还是存在的,未改变的蓝色节点将不会在新状态中被再次render渲染,而红色节点则会重新渲染,这就使得调试变得非常容易,如果你隔离了引起状态变化的action,就可以回到过去任意时间。

Redux工作原理

  Redux出奇简单,它使用一个函数为reducer (这个名词是来自于Javasctip的 reduce 方法) ,只需要两个参数:一个动作action和下一个状态

  Reducer函数能够访问当前状态,将动作应用到状态,返回下一个符合业务的状态,这是一种状态模式实现。

  Reducer设计为纯函数,也就是说,它们没有副作用,如果你传送同样的值给它,哪怕几百次,总是会得到同样的值,什么改变也没有发生,这就让人感觉更加确定性,也就是可预期性的。

  Reducer并不存储状态,只传递状态,返回状态,这使得它看上去也像动作Action。

 

如何开始使用?

  使用Redux之前,先了解一下基本概念:

  • Redux 和 React 捆绑在一个模块中称为 Webpack. Webpack是非常强大,如果你掌握了Redux和React,你就会使用它。
  • 大部分代码案例将使用ES6语法.

开发工具包:https://github.com/gaearon/react-hot-boilerplate 

这个工具中有一些使用样本,我们可以下载到本地:

$ git clone https://github.com/gaearon/react-hot-boilerplate.git friendlist
$ cd friendlist && npm install
$ npm start

你能访问t http://localhost:3000,得到:Hello World

 

安装

当我们开始自己的案例时,需要安装下面的包:

  • Redux : 这个是基本库包
  • React-redux : 绑定到React
  • Redux-devtools : 开发可选工具

源码目录结构如下:

+-- src
| +-- actions
| +-- index.js
| +-- components
| +-- index.js
| +-- constants
| +-- ActionTypes.js
| +-- containers
| +-- App.js
| +-- FriendListApp.js
| +-- reducers
| +-- index.js
| +-- friendlist.js
| +-- utils
| +-- index.js
+-- index.html
+-- app.css

 

更进一步开发源码见案例代码:Github

通过simple-redux理解React.js的Redux工作原理

什么是前端Flux?

为什么要使用GraphQL和Falcor?

Elm架构

Reactive编程

React.JS基础教程