- 若在redux中使用immutable.js,不要在mapStateToProps中使用toJS()
因為toJS()每次都返回一個新對象,這導(dǎo)致redux每次比較判斷mapStateToProps返回對象是否改變時福澡,都認為發(fā)生了改變,導(dǎo)致不必要的渲染
- 在redux項目中引入reselect,它提供一個函數(shù)createSelector涛漂,用來創(chuàng)建有記憶力功能的selector
- actionChannel,限制并發(fā)一次執(zhí)行一個任務(wù)
channel,限制并發(fā)一次執(zhí)行N個任務(wù)检诗,只需創(chuàng)建N個相同的channel即可
eventChannel,連接外部事件匈仗,為redux store以外事件源創(chuàng)建一個channel,如socket
- 在saga中,我們發(fā)起一個異步請求岁诉,
yield call(Api.fetchUser, action.payload);
實際上锚沸,我們可以直接通過yield fetchUser()
執(zhí)行我們的異步任務(wù),并返回一個Promise涕癣。但是這樣的話不好做模擬測試:我們在測試過程中哗蜈,一般不會真的執(zhí)行異步任務(wù),而是替換成一個假函數(shù)坠韩。實際上距潘,我們只需要確保yield了一個正確的函數(shù),并且函數(shù)有著正確的參數(shù)只搁。
因此音比,相比于直接調(diào)用異步函數(shù), 我們可以僅僅 yield 一條描述函數(shù)調(diào)用的指令 氢惋,由redux-saga中間件負責(zé)解釋執(zhí)行該指令洞翩,并在獲得結(jié)果響應(yīng)時恢復(fù)Generator的執(zhí)行。這條指令是一個純 Javascript 對象
{
CALL: {
fn: Api.fetchUser,
args: ['alice']
}
}
這樣焰望,當(dāng)我們需要測試Generator函數(shù)時骚亿,就可以用一條簡單的assert語句來比較兩個Effect對象(即使不在Redux環(huán)境中):
assert.deepEqual(
iterator.next().value,
call(Api.fetchUser, 'alice'),
"Should yield an Effect call(Api.fetchUser, 'alice')"
)
- effects阻塞問題
function | block |
---|---|
take | Blocking |
call | Blocking |
all | Blocking |
putResolve | Blocking |
join | Blocking |
put | Non-Blocking |
fork | Non-Blocking |
cancel | Non-Blocking |
cps | Non-Blocking |