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:
npm install redux-observable rxjs --save
创建 Epic
在 Redux-observable 中,我们可以将异步操作和副作用封装在 Epic 中。Epic 是一个函数,它接收一个 Observable,然后返回一个 Observable。在这个函数中,我们可以使用 RxJS 操作符来处理异步操作和副作用。
下面是一个简单的 Epic 示例:
import { ofType } from 'redux-observable'; import { map } from 'rxjs/operators'; const pingEpic = action$ => action$.pipe( ofType('PING'), map(action => ({ type: 'PONG' })) );
这个 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