異步 Action
通過 redux-thunk
,在 action 中 dispatch action ,可以是簡化異步工作流育八。
Middleware
它提供的是位于 action 被發(fā)起之后刨秆,到達(dá) reducer 之前的擴展點。 middleware 最優(yōu)秀的特性就是可以被鏈?zhǔn)浇M合。你可以在一個項目中使用多個獨立的第三方 middleware恍箭。
注意 applyMiddleware 的實現(xiàn)方式。
// 警告:這只是一種“單純”的實現(xiàn)方式瞧省!
// 這 *并不是* Redux 的 API.
function applyMiddleware(store, middlewares) {
middlewares = middlewares.slice()
middlewares.reverse()
let dispatch = store.dispatch
middlewares.forEach(middleware =>
dispatch = middleware(store)(dispatch)
)
return Object.assign({}, store, { dispatch })
}
計算衍生數(shù)據(jù)
Reselect 庫可以創(chuàng)建可記憶的(Memoized)扯夭、可組合的 selector 函數(shù)鳍贾。Reselect selectors 可以用來高效地計算 Redux store 里的衍生數(shù)據(jù)。
實現(xiàn)撤銷歷史
reducer enhance 的產(chǎn)生
combineReducer
- 在生成新的 state 樹時交洗,combinerReducers 將調(diào)用每一個拆分之后的 reducer 和與當(dāng)前的 Action骑科,如果有需要的話會使得每一個 reducer 有機會響應(yīng)和更新拆分后的 state。所以构拳,在這個意義上咆爽, combineReducers 會調(diào)用所有的 reducer,嚴(yán)格來說是它包裝的所有 reducer置森。
- 你可以在任何級別的 reducer 中使用 combineReducer斗埂,不僅僅是在創(chuàng)建根 reducer 的時候。
State 范式化(重要)
在 Redux Store 中管理關(guān)系數(shù)據(jù)或嵌套數(shù)據(jù)的推薦做法是將這一部分視為數(shù)據(jù)庫凫海,并且將數(shù)據(jù)按范式化存儲呛凶。因為:
- 當(dāng)數(shù)據(jù)在多處冗余后,需要更新時盐碱,很難保證所有的數(shù)據(jù)都進行更新把兔。
- 嵌套的數(shù)據(jù)意味著 reducer 邏輯嵌套更多、復(fù)雜度更高瓮顽。尤其是在打算更新深層嵌套數(shù)據(jù)時县好。
- 不可變的數(shù)據(jù)在更新時需要狀態(tài)樹的祖先數(shù)據(jù)進行復(fù)制和更新,并且新的對象引用會導(dǎo)致與之 connect 的所有 UI 組件都重復(fù) render暖混。盡管要顯示的數(shù)據(jù)沒有發(fā)生任何改變缕贡,對深層嵌套的數(shù)據(jù)對象進行更新也會強制完全無關(guān)的 UI 組件重復(fù) render
如何設(shè)計范式數(shù)據(jù):
- 任何類型的數(shù)據(jù)在 state 中都有自己的 “表”。
- 任何 “數(shù)據(jù)表” 應(yīng)將各個項目存儲在對象中拣播,其中每個項目的 ID 作為 key晾咪,項目本身作為 value。
- 任何對單個項目的引用都應(yīng)該根據(jù)存儲項目的 ID 來完成贮配。
- ID 數(shù)組應(yīng)該用于排序谍倦。
Reducer 邏輯復(fù)用
高階 reducer 是一個接收 reducer 函數(shù)作為參數(shù),并返回新的 reducer 函數(shù)的函數(shù)泪勒。它也可以被看作成一個“reducer 工廠”昼蛀。
創(chuàng)建特定的 reducer 有兩種最常見的方式,一個是使用給定的前綴或者后綴生成新的 action 常量圆存,另一個是在 action 對象上附加額外的信息叼旋。下面是它們大概的樣子:
不可變更新模式
- 更新嵌套的對象
- 在數(shù)組中插入和刪除數(shù)據(jù)
- 在一個數(shù)組中更新一個項目
- 不可變更新工具庫
初始化 State
他們會優(yōu)先選擇通過 preloadedState 參數(shù)傳到 createStore() 的對象中的相應(yīng)值,但是如果你不傳任何東西沦辙,或者沒設(shè)置相應(yīng)的字段夫植,那么 reducer 就會選擇指定的默認(rèn) state 參數(shù)來取代。