如何在 Redux Reducer 中访问状态?

在 Redux 应用程序中,Reducer 是一个纯函数,它的作用是接收旧的 state 和 action,并返回新的 state。该函数通常包含在 switch 语句中,以便根据不同的 action 类型执行不同的操作。但是,有时候需要在 Reducer 中访问其他状态,以便进行更复杂的逻辑处理。

使用 combineReducers

Redux 提供了 combineReducers 函数,用于将多个 Reducer 合并成一个单一的 Reducer。每个 Reducer 只负责管理应用程序 state 的一部分。因此,如果需要在 Reducer 中访问其他状态,最好将它们拆分为不同的 state 片段,然后使用 combineReducers 将它们合并起来。

例如,假设我们的应用程序具有以下 state:

-
  ----- ------
  --------- ------
  ----- -----
-

我们可以将这些 state 拆分为单独的 Reducer:

------ - --------------- - ---- --------
------ ----------- ---- ----------------
------ --------------- ---- --------------------
------ ----------- ---- ----------------

----- ----------- - -----------------
  ----- ------------
  --------- ----------------
  ----- -----------
---

------ ------- ------------

现在,我们可以在 cartReducer 中访问 userproducts 状态:

------ - ----------- - ---- -------------------------

----- ------------ - -
  ------ --
--

----- ----------- - ------ - ------------- ------- -- -
  ------ ------------- -
    ---- ------------
      ----- - ----- -------- - - ------ -- ------
      -- ---------
      ------ ---------
    --------
      ------ ------
  -
--

------ ------- ------------

使用 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