npm 包 redux-saga-effects 使用教程

阅读时长 9 分钟读完

在前端开发中,如何优雅地处理异步流程一直是一个关键的问题。本文将介绍如何使用 redux-saga-effects 这个 npm 包来管理异步流程。

redux-saga-effects 是什么?

redux-saga-effects 是一个 Redux 应用程序的中间件,它使用 ES6 generator 来优雅地处理异步操作。redux-saga-effects 提供了一个简单而强大的方式来处理异步操作,例如异步请求、定时器,以及多个异步操作之间的协调。

安装 redux-saga-effects

要开始使用 redux-saga-effects,需要先安装它。可以通过 npm 安装 redux-saga-effects:

安装后,还需要将 redux-saga-effects 中间件添加到 Redux store 中。

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

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

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

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

使用 redux-saga-effects

实际上,redux-saga-effects 不是一个独立的库,它是 redux-saga 的一部分,因此需要先安装 redux-saga。

安装后,我们可以写一个简单的 saga,例如:

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

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

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

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

上面的代码中,我们首先定义了一个 handleFetchData 函数,用于处理 FETCH_DATA action。如果 fetchData 函数调用成功,我们会使用 put 函数来触发一个 fetchDataSuccess action,如果调用失败,我们会使用 put 函数来触发一个 fetchDataFailure action。

我们还定义了一个 watchFetchData 函数,用于监听 FETCH_DATA action,并触发 handleFetchData 函数。

最后,我们将 watchFetchData 导出为 mySaga,然后在 Redux store 中使用 sagaMiddleware.run(mySaga) 来运行这个 saga。

示例代码

以下是一个具体的示例代码,用于从一个 API 中获取数据,并将它们显示在页面中。

actions.js

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

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

reducer.js

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

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

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

api.js

sagas.js

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

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

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

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

App.js

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

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

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

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

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

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

在上面的代码中,我们首先定义了一个 fetchData action creator,在组件挂载完成后调用它来获取数据。

我们还将组件连接到 Redux store 中,并将 fetchData action creator 映射到组件的 props 上。

最后,我们在组件的 render 方法中检查数据、loading 和 error 状态,并将数据显示在页面上。

总结

redux-saga-effects 是一个十分优秀的 Redux 中间件,它提供了一种优雅且强大的方式来处理异步操作。本文介绍了如何使用 redux-saga-effects 来处理异步操作,并提供了示例代码供读者参考。希望读者可以通过本文了解到如何使用 redux-saga-effects 来管理异步流程。

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

纠错
反馈