banner
他山之石

他山之石

理解Redux

Redux 的核心思想是 Web 應用是一個狀態機,視圖與狀態是一一對應的。

image

最近一年的工作中都在使用 React 相關的技術棧,當初理解 Redux 也費了很大功夫,一直都想寫一點關於 Redux 的教程,現在,終於開始了。

為什麼使用 Redux#

Redux 的出現是為了解決 Javascript 中複雜的狀態管理,當你的應用變得龐大,需要處理複雜的交互場景時,你可以嘗試使用 Redux。如果你使用 React,如果你需要共享狀態到很多組件中,如果你需要處理異步,如果一個組件的狀態改變需要更新其他組件,你可能需要 Redux。

介紹#

Redux 是 JavaScript 狀態容器,提供可預測化的狀態管理。

Redux 專注於狀態管理,和 react 解耦。

Redux 可以用這三個基本原則來描述:

  • 單一狀態樹

整個應用的 state 被儲存在一棵對象樹中,並且這個對象樹只存在於唯一一個 store 中。

  • State 是只讀的

唯一改變 state 的方法就是觸發 action,action 是一個用於描述已發生事件的普通對象。

  • 使用純函數來執行修改

為了描述 action 如何改變 state 樹,你需要編寫 reducers。

Action#

Action 本質上是 JavaScript 普通對象。Redux 約定,action 內必須使用一個字符串類型的 type 字段來表示將要執行的動作。多數情況下,type 會被定義成字符串常量。當應用規模越來越大時,建議使用單獨的模塊或文件來存放 action。

Redux 中只需把 action 創建函數的結果傳給 dispatch () 方法即可發起一次 dispatch 過程。
store 裡能直接通過 store.dispatch () 調用 dispatch () 方法。

Reducer#

Reducers 根據傳入的 action 和 state 計算新的 state。

Reducer 就是一個純函數,接收舊的 state 和 action,返回新的 state。
只要傳入參數相同,計算得到的下一個 state 就一定相同。沒有特殊情況、沒有副作用,沒有 API 請求、沒有變量修改,單純執行計算。

  1. reducer 中不要修改 state,而是返回新對象。可以使用 Object.assign () 新建一個副本。不能這樣使用:
Object.assign(state, { visibilityFilter: action.filter })

上述代碼會改變第一個參數的值。必須把第一個參數設置為空對象。也可以開啟 ES7 使用對象展開運算符,從而使用 {...state, ...newState} 達到相同的目的。
3. 在 default 情況下返回舊的 state。遇到未知的 action 時,一定要返回舊的 state。

Store#

store 是維持應用 state 的容器,並在當你發起 action 的時候調用 reducer。
Store 就是把它們聯繫到一起的對象。Store 有以下職責:

  • 維持應用的 state;
  • 提供 getState () 方法獲取 state;
  • 提供 dispatch (action) 方法更新 state;
  • 通過 subscribe (listener) 註冊監聽器;
  • 通過 subscribe (listener) 返回的函數註銷監聽器。

Redux 應用只有一個單一的 store。當需要拆分數據處理邏輯時,你應該使用多個 reducer 組合而不是創建多個 store。

數據流#

Redux 應用中數據的生命周期遵循下面 4 個步驟:

  1. 調用 store.dispatch (action)。

你可以在任何地方調用 store.dispatch (action),包括組件中、XHR 回調中、甚至定時器中。

  1. Redux store 調用傳入的 reducer 函數。

Store 會把兩個參數傳入 reducer: 當前的 state 樹和 action。

  1. 根 reducer 應該把多個子 reducer 輸出合併成一個單一的 state 樹。

  2. Redux store 保存了根 reducer 返回的完整 state 樹。

總結#

本文只是一些關於 redux 的概念和基本介紹,下次會帶來它的基本用法。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。