在 Redux 应用程序中,Reducer 是一个纯函数,它的作用是接收旧的 state 和 action,并返回新的 state。该函数通常包含在 switch
语句中,以便根据不同的 action 类型执行不同的操作。但是,有时候需要在 Reducer 中访问其他状态,以便进行更复杂的逻辑处理。
使用 combineReducers
Redux 提供了 combineReducers
函数,用于将多个 Reducer 合并成一个单一的 Reducer。每个 Reducer 只负责管理应用程序 state 的一部分。因此,如果需要在 Reducer 中访问其他状态,最好将它们拆分为不同的 state 片段,然后使用 combineReducers
将它们合并起来。
例如,假设我们的应用程序具有以下 state:
- ----- ------ --------- ------ ----- ----- -
我们可以将这些 state 拆分为单独的 Reducer:
------ - --------------- - ---- -------- ------ ----------- ---- ---------------- ------ --------------- ---- -------------------- ------ ----------- ---- ---------------- ----- ----------- - ----------------- ----- ------------ --------- ---------------- ----- ----------- --- ------ ------- ------------
现在,我们可以在 cartReducer
中访问 user
和 products
状态:
------ - ----------- - ---- ------------------------- ----- ------------ - - ------ -- -- ----- ----------- - ------ - ------------- ------- -- - ------ ------------- - ---- ------------ ----- - ----- -------- - - ------ -- ------ -- --------- ------ --------- -------- ------ ------ - -- ------ ------- ------------
使用 getState
如果不想使用 combineReducers
,或者需要在 Reducer 处理特定 action 类型时访问其他状态,可以使用 Redux 提供的 getState
函数。getState
函数可以获取 Store 的当前 state。
例如,假设我们有以下 Reducer:
------ - ----------- - ---- ------------------------- ------ - ----------- - ---- ------------------------- ----- ------------ - - ----- ------ ----- ----- -- ----- ----------- - ------ - ------------- ------- -- - ------ ------------- - ---- ------------ -- --- ----------- ------ --- ---- -- ----- - ---- - - ----------------- -- --------- ------ --------- ---- ------------ -- --- ----------- ------ --- ---- -- ----- - ---- - - ----------------- -- --------- ------ --------- -------- ------ ------ - -- ------ ------- ------------
注意,使用 getState
函数可能会使 Reducer 更难测试和调试,并增加代码复杂性。因此,应该尽量避免在 Reducer 中使用它。
结论
在大多数情况下,最好使用 combineReducers
将状态拆分为不同的 Reducer,并将它们合并起来。这样可以更好地组织代码,减少复杂性,并使测试和调试更容易。但是,如果需要在 Reducer 中访问其他状态,则可以使用 Redux 提供的 getState
函数。
示例代码:https://github.com/reduxjs/redux/blob/master/examples/shopping-cart/src/reducers/index.js
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/31254