https://github.com/react-guide/redux-tutorial-cn
三大原则
Redux 可以用这三个基本原则来描述:
单一数据源
整个应用的 state 被储存在一棵 object tree 中,并且这个 object tree 只存在于唯一一个 store 中。
这让同构应用开发变得非常容易。来自服务端的 state 可以在无需编写更多代码的情况下被序列化并注入到客户端中。由于是单一的 state tree ,调试也变得非常容易。在开发中,你可以把应用的 state 保存在本地,从而加快开发速度。此外,受益于单一的 state tree ,以前难以实现的如“撤销/重做”这类功能也变得轻而易举。
console.log(store.getState())
/* 输出
{
visibilityFilter: 'SHOW_ALL',
todos: [
{
text: 'Consider using Redux',
completed: true,
},
{
text: 'Keep all state in a single tree',
completed: false
}
]
}
*/
State 是只读的
唯一改变 state 的方法就是触发 action,action 是一个用于描述已发生事件的普通对象。
这样确保了视图和网络请求都不能直接修改 state,相反它们只能表达想要修改的意图。因为所有的修改都被集中化处理,且严格按照一个接一个的顺序执行,因此不用担心 race condition 的出现。 Action 就是普通对象而已,因此它们可以被日志打印、序列化、储存、后期调试或测试时回放出来。
store.dispatch({
type: 'COMPLETE_TODO',
index: 1
})
store.dispatch({
type: 'SET_VISIBILITY_FILTER',
filter: 'SHOW_COMPLETED'
})
使用纯函数来执行修改
为了描述 action 如何改变 state tree ,你需要编写 reducers。
Reducer 只是一些纯函数,它接收先前的 state 和 action,并返回新的 state。刚开始你可以只有一个 reducer,随着应用变大,你可以把它拆成多个小的 reducers,分别独立地操作 state tree 的不同部分,因为 reducer 只是函数,你可以控制它们被调用的顺序,传入附加数据,甚至编写可复用的 reducer 来处理一些通用任务,如分页器。
function visibilityFilter(state = 'SHOW_ALL', action) {
switch (action.type) {
case 'SET_VISIBILITY_FILTER':
return action.filter
default:
return state
}
}
function todos(state = [], action) {
switch (action.type) {
case 'ADD_TODO':
return [
...state,
{
text: action.text,
completed: false
}
]
case 'COMPLETE_TODO':
return state.map((todo, index) => {
if (index === action.index) {
return Object.assign({}, todo, {
completed: true
})
}
return todo
})
default:
return state
}
}
import { combineReducers, createStore } from 'redux'
let reducer = combineReducers({ visibilityFilter, todos })
let store = createStore(reducer)
生态系统
Redux 是一个体小精悍的库,但它相关的内容和 API 都是精挑细选的,足以衍生出丰富的工具集和可扩展的生态系统。
如果需要关于 Redux 所有内容的列表,推荐移步至 Awesome Redux。它包含了示例、样板代码、中间件、工具库,还有很多其它相关内容。要想学习 React 和 Redux ,React/Redux Links 包含了教程和不少有用的资源,Redux Ecosystem Links 则列出了 许多 Redux 相关的库及插件。
本页将只列出由 Redux 维护者审查过的一部分内容。不要因此打消尝试其它工具的信心!整个生态发展得太快,我们没有足够的时间去关注所有内容。建议只把这些当作“内部推荐”,如果你使用 Redux 创建了很酷的内容,不要犹豫,马上发个 PR 吧。
学习 Redux
演示
- 开始学习 Redux — 向作者学习 Redux 基础知识(30 个免费的教学视频)
- 学习 Redux — 搭建一个简单的图片应用,简要使用了 Redux、React Router 和 React.js 的核心思想
示例应用
- 官方示例 — 一些官方示例,涵盖了多种 Redux 技术
- SoundRedux — 用 Redux 构建的 SoundCloud 客户端
- grafgiti — 在你的 Github 的 Contributor 页上创建 graffiti
- React-lego — 如何像积木一样,一块块地扩展你的 Redux 技术栈
教程与文章
- Redux 教程
- Redux Egghead 课程笔记
- 使用 React Native 进行数据整合
- What the Flux?! Let’s Redux.
- Leveling Up with React: Redux
- A cartoon intro to Redux
- Understanding Redux
- Handcrafting an Isomorphic Redux Application (With Love)
- Full-Stack Redux Tutorial
- Getting Started with React, Redux, and Immutable
- Secure Your React and Redux App with JWT Authentication
- Understanding Redux Middleware
- Angular 2 — Introduction to Redux
- Apollo Client: GraphQL with React and Redux
- Using redux-saga To Simplify Your Growing React Native Codebase
- Build an Image Gallery Using Redux Saga
- Working with VK API (in Russian)
演讲
- Live React: Hot Reloading and Time Travel — 了解 Redux 如何使用限制措施,让伴随时间旅行的热加载变得简单
- Cleaning the Tar: Using React within the Firefox Developer Tools — 了解如何从已有的 MVC 应用逐步迁移至 Redux
- Redux: Simplifying Application State — Redux 架构介绍
使用 Redux
不同框架绑定
- react-redux — React
- ng-redux — Angular
- ng2-redux — Angular 2
- backbone-redux — Backbone
- redux-falcor — Falcor
- deku-redux — Deku
- polymer-redux - Polymer
- ember-redux - Ember.js
中间件
- redux-thunk — 用最简单的方式搭建异步 action 构造器
- redux-promise — 遵从 FSA 标准的 promise 中间件
- redux-axios-middleware — 使用 axios HTTP 客户端获取数据的 Redux 中间件
- redux-observable — Redux 的 RxJS 中间件
- redux-rx — 给 Redux 用的 RxJS 工具,包括观察变量的中间件
- redux-logger — 记录所有 Redux action 和下一次 state 的日志
- redux-immutable-state-invariant — 开发中的状态变更提醒
- redux-unhandled-action — 开发过程中,若 Action 未使 State 发生变化则发出警告
- redux-analytics — Redux middleware 分析
- redux-gen — Redux middleware 生成器
- redux-saga — Redux 应用的另一种副作用 model
- redux-action-tree — Redux 的可组合性 Cerebral-style 信号
- apollo-client — 针对 GraphQL 服务器及基于 Redux 的 UI 框架的缓存客户端
路由
- redux-simple-router — 保持 React Router 和 Redux 同步
- redux-router — 由 React Router 绑定到 Redux 的库
组件
- redux-form — 在 Redux 中时时持有 React 表格的 state
- react-redux-form — 在 React 中使用 Redux 生成表格
增强器(Enhancer)
- redux-batched-subscribe — 针对 store subscribers 的自定义批处理与防跳请求
- redux-history-transitions — 基于独断的 action 的 history 库转换
- redux-optimist — 使 action 可稍后提交或撤销
- redux-optimistic-ui — A reducer enhancer to enable type-agnostic optimistic updates 允许对未知类型进行更新的 reducer 增强器
- redux-undo — 使 reducer 便捷的重做/撤销,以及 action 记录功能
- redux-ignore — 通过数组或过滤功能忽略 redux action
- redux-recycle — 在确定的 action 上重置 redux 的 state
- redux-batched-actions — 单用户通知去 dispatch 多个 action
- redux-search — 自动 index 站点资源并实现即时搜索
- redux-electron-store — Store 增强器, 可同步不同 Electron 进程上的多个 Redux store
- redux-loop — Sequence effects purely and naturally by returning them from your reducers
- redux-side-effects — Utilize Generators for declarative yielding of side effects from your pure reducers
工具集
- reselect — 受 NuclearJS 启发,有效派生数据的选择器
- normalizr — 为了让 reducers 更好的消化数据,将API返回的嵌套数据范式化
- redux-actions — 在初始化 reducer 和 action 构造器时减少样板代码 (boilerplate)
- redux-act — 生成 reducer 和 action 创建函数的库
- redux-transducers — Redux 的编译器工具
- redux-immutablejs — 将Redux 和 Immutable 整合到一起的工具
- redux-tcomb — 在 Redux 中使用具有不可变特性、并经过类型检查的 state 和 action
- redux-mock-store - 模拟 redux 来测试应用
- redux-actions-assertions — Redux actions 测试断言
开发者工具
- redux-devtools — 一个使用时间旅行 UI 、热加载和 reducer 错误处理器的 action 日志工具,最早演示于 React Europe 会议
- Redux DevTools Extension — 打包了 Redux DevTools 及附加功能的 Chrome 插件
开发者工具监听器
- Log Monitor — Redux DevTools 默认监听器,提供树状视图
- Dock Monitor — A resizable and movable dock for Redux DevTools monitors
- Slider Monitor — Redux DevTools 自定义监听器,可回放被记录的 Redux action
- Inspector — Redux DevTools 自定义监听器,可筛选、区分 action,深入 state 并监测变化
- Diff Monitor — 区分不同 action 的 store 变动的 Redux Devtools 监听器
- Filterable Log Monitor — 树状可筛选视图的 Redux DevTools 监听器
- Chart Monitor — Redux DevTools 图表监听器
- Filter Actions — 可筛选 action 、可组合使用的 Redux DevTools 监听器
社区公约
- Flux Standard Action — Flux 中 action object 的人性化标准
- Canonical Reducer Composition — 嵌套 reducer 组成的武断标准
- Ducks: Redux Reducer Bundles — 关于捆绑多个 reducer, action 类型 和 action 的提案
翻译
- 中文文档 — 简体中文
- 繁體中文文件 — 繁体中文
- Redux in Russian — 俄语
- Redux en Español - 西班牙语
更多
- Awesome Redux 是一个包含大量与 Redux 相关的库列表。
- React-Redux Links React、Redux、ES6 的高质量文章、教程、及相关内容列表。
- Redux Ecosystem Links Redux 相关库、插件、工具集的分类资源。