Redux-observable 实践指南

阅读时长 7 分钟读完

Redux-observable 是一个基于 RxJS 的 Redux 中间件,它可以帮助我们处理异步操作和副作用。在实际开发中,我们经常需要处理一些异步操作,例如网络请求、定时器、WebSocket 等等,这些操作会产生副作用,而 Redux-observable 可以让我们更好地管理这些副作用。

本文将介绍 Redux-observable 的使用方法,并通过示例代码来展示如何实践。

什么是 Redux-observable?

Redux-observable 是一个基于 RxJS 的 Redux 中间件,它是一个专门用于处理异步操作和副作用的工具。它使用了 RxJS 的 Observable 来处理异步操作,可以让我们更加方便地管理异步操作和副作用。

Redux-observable 的主要特点包括:

  • 基于 RxJS,可以使用 RxJS 提供的丰富的操作符来处理异步操作和副作用。
  • 可以将异步操作和副作用封装在 Epic 中,方便管理和组织。
  • 可以使用类似于 Redux 中间件的方式来使用 Redux-observable。

Redux-observable 的使用方法

安装

首先需要安装 Redux-observable 和 RxJS:

创建 Epic

在 Redux-observable 中,我们可以将异步操作和副作用封装在 Epic 中。Epic 是一个函数,它接收一个 Observable,然后返回一个 Observable。在这个函数中,我们可以使用 RxJS 操作符来处理异步操作和副作用。

下面是一个简单的 Epic 示例:

这个 Epic 接收一个 action$ Observable,然后使用 ofType 操作符来过滤出 type 为 'PING' 的 action,然后使用 map 操作符将这个 action 转换成一个新的 action,type 为 'PONG'。

使用 Redux-observable

接下来,我们需要将 Redux-observable 中间件应用到 Redux Store 中:

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

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

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

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

在这个代码中,我们使用 createEpicMiddleware 创建了一个 Redux-observable 中间件,然后将这个中间件应用到了 Redux Store 中。最后,我们使用 epicMiddleware.run(rootEpic) 来启动 rootEpic。

Redux-observable 的实践

下面通过一个完整的示例来展示如何在实际项目中使用 Redux-observable。

示例需求

我们需要实现一个简单的计时器功能,用户可以点击 Start 按钮来开始计时,点击 Stop 按钮来停止计时。计时器每秒钟会自动加 1,同时会发送一个 action 到 Redux Store 中。

示例代码

首先,我们需要创建一个 action:

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

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

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

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

然后,我们需要创建一个 reducer:

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

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

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

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

接下来,我们需要创建一个 Epic:

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

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

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

在这个 Epic 中,我们使用 ofType 操作符来过滤出 type 为 START_TIMER 的 action,然后使用 switchMap 操作符来创建一个 interval Observable,这个 Observable 每秒钟会发送一个值。我们使用 mapTo 操作符将这个值转换成一个 tick action。最后,我们使用 takeUntil 操作符来监听 STOP_TIMER action,当收到这个 action 时,我们会停止 interval Observable。

最后,我们需要将这个 Epic 和 reducer 应用到 Redux Store 中:

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

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

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

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

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

现在,我们已经完成了一个简单的计时器功能,用户可以点击 Start 按钮来开始计时,点击 Stop 按钮来停止计时。

总结

Redux-observable 是一个基于 RxJS 的 Redux 中间件,它可以帮助我们处理异步操作和副作用。在实际开发中,我们经常需要处理一些异步操作,而 Redux-observable 可以让我们更好地管理这些异步操作和副作用。本文通过一个完整的示例来展示如何在实际项目中使用 Redux-observable。

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

纠错
反馈