# 動機
隨著 JavaScript 單頁應用開發日趨復雜,**JavaScript 需要管理比任何時候都要多的 state (狀態)**。 這些 state 可能包括服務器響應、緩存數據、本地生成尚未持久化到服務器的數據,也包括 UI 狀態,如激活的路由,被選中的標簽,是否顯示加載動效或者分頁器等等。
管理不斷變化的 state 非常困難。如果一個 model 的變化會引起另一個 model 變化,那么當 view 變化時,就可能引起對應 model 以及另一個 model 的變化,依次地,可能會引起另一個 view 的變化。直至你搞不清楚到底發生了什么。**state 在什么時候,由于什么原因,如何變化已然不受控制。** 當系統變得錯綜復雜的時候,想重現問題或者添加新功能就會變得舉步維艱。
如果這還不夠糟糕,考慮一些**來自前端開發領域的新需求**,如更新調優、服務端渲染、路由跳轉前請求數據等等。前端開發者正在經受前所未有的復雜性,[難道就這么放棄了嗎?](http://www.quirksmode.org/blog/archives/2015/07/stop_pushing_th.html)當然不是。
這里的復雜性很大程度上來自于:**我們總是將兩個難以理清的概念混淆在一起:變化和異步**。 我稱它們為[曼妥思和可樂](https://en.wikipedia.org/wiki/Diet_Coke_and_Mentos_eruption)。如果把二者分開,能做的很好,但混到一起,就變得一團糟。一些庫如 [React](http://facebook.github.io/react) 試圖在視圖層禁止異步和直接操作 DOM 來解決這個問題。美中不足的是,React 依舊把處理 state 中數據的問題留給了你。Redux 就是為了幫你解決這個問題。
跟隨 [Flux](http://facebook.github.io/flux)、[CQRS](http://martinfowler.com/bliki/CQRS.html) 和 [Event Sourcing](http://martinfowler.com/eaaDev/EventSourcing.html) 的腳步,通過限制更新發生的時間和方式,**Redux 試圖讓 state 的變化變得可預測**。這些限制條件反映在 Redux 的[三大原則](ThreePrinciples.md)中。
- 自述
- 介紹
- 動機
- 核心概念
- 三大原則
- 先前技術
- 學習資源
- 生態系統
- 示例
- 基礎
- Action
- Reducer
- Store
- 數據流
- 搭配 React
- 示例:Todo List
- 高級
- 異步 Action
- 異步數據流
- Middleware
- 搭配 React Router
- 示例:Reddit API
- 下一步
- 技巧
- 配置 Store
- 遷移到 Redux
- 使用對象展開運算符
- 減少樣板代碼
- 服務端渲染
- 編寫測試
- 計算衍生數據
- 實現撤銷重做
- 子應用隔離
- 組織 Reducer
- Reducer 基礎概念
- Reducer 基礎結構
- Reducer 邏輯拆分
- Reducer 重構示例
- combineReducers 用法
- combineReducers 進階
- State 范式化
- 管理范式化數據
- Reducer 邏輯復用
- 不可變更新模式
- 初始化 State
- 結合 Immutable.JS 使用 Redux
- 常見問題
- 綜合
- Reducer
- 組織 State
- 創建 Store
- Action
- 不可變數據
- 代碼結構
- 性能
- 設計哲學
- React Redux
- 其它
- 排錯
- 詞匯表
- API 文檔
- createStore
- Store
- combineReducers
- applyMiddleware
- bindActionCreators
- compose
- react-redux 文檔
- API
- 排錯