隨着 JavaScript 單頁應用開發日趨複雜,愈來愈多的 state (狀態)須要在前端進行管理。前端
這些 state 可能包括服務器響應、緩存數據、本地生成還沒有持久化到服務器的數據,也包括 UI 狀態,如激活的路由,被選中的標籤,是否顯示加載動效或者分頁器等等。react
爲了高效的管理 state 而不是簡單的在全局上新建變量,開發者須要捋清 model/view 之間的關係,以下降前端開發的複雜性。此處以 Redux 爲例,總結如何利用其設計思想以及實踐經驗,來使得應用的 state 管理變得容易。redux
Redux 的核心概念第一點則是 state 的表示,你能夠用一個對象來表示應用的 state (能夠當作 model) 但不能直接修改他(沒有 setter)。這一步定義的內容能夠當作是用於控制頁面效果、動畫的一些開關狀態。緩存
{ todo: [], name: 'me' }
想要修改 state 中的數據只能經過發起 action 來實現(這樣作的好處就是能夠清晰的知道應用中到底發生了什麼), action 也是一個普通對象,用來描述將要發生什麼。在 action 中咱們須要存儲發生事件的描述以及用於更新 state 的屬性數據,好比:服務器
{ type: 'ADD_TODO', text: 'Go to swimming pool' }
那麼如何接收 action 並更新返回新的 state 呢?用 reducer 函數。它接收 state 和 action,在內部處理後並返回新的 state。考慮到應用的複雜性,咱們能夠分別編寫 reducer 分別獨立地操做 state tree 的不一樣部分。函數
咱們約定,action 內必須使用一個字符串類型的 type 字段來表示將要執行的動做。多數狀況下,type 會被定義成字符串常量。除了 type 字段外,對象結構徹底由本身決定。可是須要注意的是應該儘可能減小在 action 中傳遞的數據。工具
爲了瞭解生成 action,還須要知道 action 建立函數,該函數只是簡單的返回一個 action,這樣作將使 action 建立函數更容易被移植和測試。例如:測試
function addTodo(text) { return { type: ADD_TODO, text } }
當你把 action 建立函數結果傳給 dispatch() 方法,便可發起一次 dispatch 過程,例如:動畫
dispatch(addTodo(text))
在使用過程當中可能用到的工具包括 connect()
, bindActionCreators()
spa
reducer 就是一個純函數,接收舊的 state 和 action,返回新的 state。經過 reducer,咱們不只能夠修改 state 還能夠藉機初始化 state。
針對 action 的處理咱們須要注意:不要修改 state,且在 default 狀況下返回舊的 state。
在使用過程當中可能用到的工具包括 combineReducers()
在知道了如何用 reducer 來根據 action 更新 state 後,須要進一步瞭解的就是 store —— 將它們聯繫到一塊兒的對象。store 具備如下職責:
getState()
方法獲取 state;dispatch(action)
方法更新 state;subscribe(listener)
註冊監聽器;subscribe(listener)
返回的函數註銷監聽器。Redux 應用中的數據的生命週期遵循四個步驟:
store.dispatch(action)
結合 react 開發其中比較重要的一點在於如何設計組件層次結構。結合 react 能夠知道在組件層次方面,主要須要考慮兩點:展現組件和容器組件,固然很差區分的組件能夠劃分爲其餘組件。