Redux 如何优雅的处理多个请求问题

阅读时长 9 分钟读完

Redux 如何优雅的处理多个请求问题

Redux 是一个用于 JavaScript 应用程序的可预测状态容器,适用于处理复杂的前端业务逻辑,但在处理多个请求问题时,我们需要特别注意。在本文中,我们将介绍 Redux 如何优雅地处理多个请求问题,为前端开发带来便利。

  1. 问题背景

在前端开发中,我们经常需要向服务端发送多个请求,获取不同的数据进行展示,但在实际应用中,每个请求都有独立的状态,如请求中、请求成功、请求失败等,如果采用传统的方式处理这些状态,会使代码变得臃肿且不易维护。

  1. Redux 解决方案

Redux 提供了一个非常好的解决方案,它可以轻松处理多个请求状态,使代码结构更加清晰明了,易于维护。

首先,我们需要在 Redux Store 中定义多个请求状态,例如:

上述代码定义了三个请求状态,分别为用户数据、联系人数据和消息数据,每个状态都包含了 loading、data 和 error 三个属性,分别用于表示请求状态、请求成功后的数据和请求失败后的错误信息。

接下来,我们需要为每个请求定义 action 和 reducer,例如:

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

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

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

上述代码定义了用户数据的 action 和 reducer,从 LOAD_USER 开始,分别对应请求中、请求成功和请求失败的状态,其中 action 的 type 包括了三种状态,分别为 LOAD_USER、LOAD_USER_SUCCESS 和 LOAD_USER_FAILURE,对应请求的不同状态,同时根据 type 执行相应的操作,返回新的 state。

类似地,我们可以为其他请求数据定义相应的 action 和 reducer,并将它们与 Store 中的状态进行关联,如下所示:

在上述代码中,我们将 userReducer、contactsReducer 和 messagesReducer 合并为 rootReducer,然后使用 createStore 创建一个 Store,并将 rootReducer 传入 createStore 中。

现在,我们已经成功地将多个请求状态纳入到 Redux Store 中,并使用 action 和 reducer 定义了不同的请求状态,使代码结构更加清晰明了,易于维护。

  1. 示例代码

下面是一个完整的示例代码,它包括两个请求:用户数据和联系人数据。

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

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

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

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

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

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

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

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

在上述代码中,我们首先定义了 App 组件,并通过 connect 将组件与 Redux Store 的状态和 action 进行关联。在 useEffect 中分别调用了 loadUser 和 loadContacts,触发了两个请求。然后根据 loading 和 error 状态,分别返回 Loading 或 Error,以及渲染请求成功后的数据。

接下来是 userActions 和 contactsActions 的定义。

userActions.js

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

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

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

contactsActions.js

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

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

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

在上述代码中,我们首先定义了 LOAD_USER、LOAD_USER_SUCCESS 和 LOAD_USER_FAILURE 三种状态,分别对应请求中、请求成功和请求失败的状态,然后定义了 loadUser、loadUserSuccess 和 loadUserFailure 三个 action,分别触发不同的状态。类似地,我们为联系人数据定义了 LOAD_CONTACTS、LOAD_CONTACTS_SUCCESS 和 LOAD_CONTACTS_FAILURE 三种状态,并分别定义了 loadContacts、loadContactsSuccess 和 loadContactsFailure 三个 action,通过 fetch 方法获取请求数据,并触发相应的 action。

  1. 总结

在本文中,我们介绍了 Redux 如何优雅地处理多个请求问题,通过 action 和 reducer 定义了不同的请求状态,将多个请求状态纳入到 Redux Store 中,使代码结构更加清晰明了,易于维护。同时,我们展示了完整的示例代码,用于帮助开发者理解 Redux 处理多个请求状态的方法。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6461dfc5968c7c53b0335ca5

纠错
反馈