第 25 天 !
我們知道 redux 結構 flux-like ,
那麼他的每個階段是在處理什麼?
這是管理 redux 資料的地方,
但跟 flux 不一樣的是,
在 redux 裡, 是不能直接設定 store,
必須去透過 reducer 返回的值來確定最後 store 保存的資料
當我們想要去操作 store 時,我們不能直接去更改它裡面的資料,
我們必須去定義這個 action , 來告訴 reducer 應該怎麼樣處理資料,
那 action 會是一個 plain object ,
但我們一定要在這個 object 裡面有一個 type 參數,
這 type 會是一個字串,用來形容我們這個 action ,
再來,我們需要帶入參數的話,
通常會增加一個 payload 參數來保存我們需要帶入的數據,
加入我們有一個動作是一個登入,
那我們的 action 格式會是:
const loginAction = {
type: 'LOGIN',
payload: {
account: 'test',
password: '1234',
},
};
action type 是常數,不變的,但是 payload 的數據會根據情境而產生一些差別,
我們可以定義一個 action creator 來讓這個 action 可以重複利用,
action creator 是一個 function , 會 return 一個 action
like:
function loginAction(account, password) {
return {
type: 'LOGIN',
payload: {
account,
password,
},
};
}
到時候我們要使用這個 action , 我們就可以直接呼叫 loginAction , 就不需要一直去寫 action 的格式了
如果說我們是在 action 去定義資料操作的事件,
那又要如何去觸發 store 的更新呢?
在 redux 裡,只能用 dispatch ,
dispatch 的功用就是,去觸發 store 的更新流程,
它唯一接收的是 action object,
並把 action object 帶入到更新流程
dispatch({
type: 'LOGIN',
payload: {
account: 'account',
password: 'password',
},
});
or with action creator :
dispatch(loginAction());
這是在 redux 裡,最核心的一個部分,
它負責整合 store 跟從外部接收的資料,
return 的資料會由 store 保存
function reducer(state = initialState, { type, payload }) {
switch (type) {
case ACTION_TYPE:
return { ...state, ...payload };
default:
return state;
}
}
它會接收兩個參數:
那我們會由 action.type 來判斷我們最終應該要如何保存的 state,
有幾點需要注意的是:
reducer 無法使用非同步state & action 的資訊來組成新的 state,而不是還需要在額外引入數據redux 判定資料的變化更新是用 immutable update 來判定,所以當我們在更新 state 的時候,要把state 複製並且更新該更新的部分