Redux 中如何实现全局 loading 状态的控制

阅读时长 5 分钟读完

什么是全局 loading 状态?

在前端开发中,我们经常需要在请求后端数据时显示一个 loading 动画,以告知用户请求正在进行中,避免用户在等待时操作造成误解操作。当然,这个 loading 动画需要在请求完成后消失。但是,每个组件都需要单独管理 loading 状态会很麻烦,而且会导致大量的冗余代码。

我们可以使用 Redux 来管理全局的 loading 状态,在任何地方 dispatch 一个 action,就能控制全局的 loading 状态。

实践

安装依赖

我们需要安装以下工具:

  • redux:Redux 状态管理库
  • react-redux:React 绑定 Redux 库
  • redux-saga:Redux 的一种高级别中间件,用于异步流程的控制。

实现

我们先来创建一个 loading 的 reducer:

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

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

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

有了 reducer ,我们还需要实现触发开始和停止的 action,我们定义这两个 action 分别为 startLoadingstopLoading,并创建 action 创造器:

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

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

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

接下来,在我们的 store 中,我们需要创建一个 Saga:

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

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

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

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

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

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

在这个 Saga 中,我们使用 put 函数来 dispatch action,这个函数用于输出结果,我们在三个对应的 actions 中控制 loading 状态。

最后,我们将所有组件需要使用的 state 连接 Redux。我们导出 loadingReducer 并合并reducer:

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

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

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

现在,你可以在任何组件中调用 startLoadingstopLoading,从而控制全局的 loading 状态,比如在 componentDidMount 中调用:

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

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

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

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

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

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

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

总结

通过 Redux 和 Redux-saga 的使用,我们可以轻松地在应用程序中实现全局 loading 状态的控制。这个开源的状态管理库,让我们可以在前端应用程序中维护复杂的状态信息,对于开发大型的 React 应用程序,非常重要。

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

纠错
反馈