Redux是一種狀態管理工具,嚴格的單向數據流是redux架構的設計核心。Redux數據流的圖示如下:
以counter爲例
Action
action就是一個普通的javascript對象,它用來描述發生了什麼變化。按照約定,action 內必須使用一個字符串類型的 type 字段來表示將要執行的動作。多數情況下,type 會被定義成字符串常量。就像我們示例中的{type: 'INCREMENT'}
和{type: 'DECREMENT'}
。除了type字段外,我們可以根據我們的需要增加字段。
爲了更好地移植,我們可以使用action生成函數,比如:
function add(number) {
const action = {
type: 'INCREMENT',
number
}
return action
}
然後我們可以直接在store裏調用store.dispatch()
來觸發state改變。
Reducer
reducer規定了如何響應action,並把變化後的結果返回給store。reducer是一個純函數,接收previousState(舊的state)和action,返回計算後得到的新state,在這個過程中不允許改變參數。例如:
function handle(state = initialState, action) {
switch(action.type) {
case 'INCREMENTNUMBERADD':
return Object.assign({}, state, {
number: action.number
})
break
default:
return state
}
}
當state裏內容很多,且相互獨立時,我們可以對reducer進行拆分,這樣每個 reducer 只負責管理全局 state 中它負責的一部分。每個 reducer 的 state 參數都不同,分別對應它管理的那部分 state 數據。最後我們把這些reducer進行合成即可,redux中提供了一個工具類combineReducers()來做這個事情。
Store
store可以認爲是一個容器,redux中store是單一的,它的主要職責有:
- 存儲state
- 通過getState()方法獲取state
- 通過subscribe()註冊監聽器
我們可以通過createStore()這個函數來生成store。