概念
React作爲一個視圖層框架,天然是不適合用來管理數據的。因爲React框架中,父子組件的通信通過props
(父向子傳遞),或者是回調函數(子向父傳遞)兩種方式實現。
若是隻是父子組件之間的通信,實現起來還不算太麻煩,若是跨層級的通信,則需要多個組件之間層層通信,實現起來不僅麻煩而且性能也不好。
還有我們知道React的組件是可以構建出一棵組件樹的,若是需要通信的兩個組件不在同一顆子樹內,那麼通信起來則會是一場噩夢。
於是就有了Redux,它可以幫助我們管理數據,所有的組件都通過統一的一個store
讀寫數據。因此我們就可以節省大量組件間通信的操作。
工作流程
下圖是Redux的工作流程。
[外鏈圖片轉存失敗(img-YnSYW3V1-1564475300202)(https://note.youdao.com/src/WEBRESOURCEf1875a2468ce5da97db888717021f5fe)]
Action
Action是把數據從應用傳到store
的有效載荷,也是store
數據的唯一來源。
Action本質上就是JavaScript對象。我們約定,action內必須使用一個字符串類型的type
字段來表示將要執行的動作。
const ADD_TODO_ITEM = 'add_todo_item';
const action = {
type: ADD_TODO_ITEM
};
Action就好比是一條命令,一條讓store
執行相應操作的命令。
Reducer
Action
是一條命令,可是store
並不能直接理解這些命令,於是就要通過Reducer
來爲store
“解釋”命令的含義。
Reducer
指定了應用狀態的變化如何響應action
併發送到store。
reducer
就是一個純函數,接收舊的state
和action
,返回新的state
。
function reducer(state, action){
if(action.type === 'add_todo_item'){
//Do something
}
}
通過爲state
設置默認屬性,還可以爲store
設置初始值。
const defailtState = {
content: '',
list: []
};
function reducer(state=defaultState, action){
if(action.type === 'add_todo_item'){
//Do something
}
return state;
}
store
顧名思義,store
就是用來保存應用數據的對象,可以想象成一個數據庫。
它有以下方法:
getState
:用來獲取store
當前的數據dispatch(action)
:將action
發送給store
,store
再轉發至reducer
進行處理。subscribe
:該方法在組件中使用,作用是註冊store
發生變化的監聽器。
需要的是注意,應用中只能有一個store
。
store的創建
import { createStore } from 'redux';
import reducer from './reducer';
const store = createStore(reducer);