设置中间件

现在我们了解了什么是Epics, 我们需要将其提供给 redux-observable 中间件从而使它可以开始监听 actions。

根 Epic

和 redux 需要单个根 Reducer 相似,redux-observable 需要单个根 Epic。正如我们在之前学过的,可以使用 combineEpics() 来完成它。

我们建议将所有的 Epics 导入到单个文件中,然后导出根 Epic 和 根 Reducer。

redux/modules/root.js

  1. import { combineEpics } from 'redux-observable';
  2. import { combineReducers } from 'redux';
  3. import ping, { pingEpic } from './ping';
  4. import users, { fetchUserEpic } from './users';
  5. export const rootEpic = combineEpics(
  6. pingEpic,
  7. fetchUserEpic
  8. );
  9. export const rootReducer = combineReducers({
  10. ping,
  11. users
  12. });

这个模式继承自 Ducks Modular Redux pattern.

配置 Store

现在创建 redux-observable 中间件的实例,传递最新的根 Epic。

  1. import { createEpicMiddleware } from 'redux-observable';
  2. import { rootEpic } from './modules/root';
  3. const epicMiddleware = createEpicMiddleware(rootEpic);

将上面的代码和你已经存在的 Store 配置像下面这样集成。

redux/configureStore.js

  1. import { createStore, applyMiddleware } from 'redux';
  2. import { createEpicMiddleware } from 'redux-observable';
  3. import { rootEpic, rootReducer } from './modules/root';
  4. const epicMiddleware = createEpicMiddleware(rootEpic);
  5. export default function configureStore() {
  6. const store = createStore(
  7. rootReducer,
  8. applyMiddleware(epicMiddleware)
  9. );
  10. return store;
  11. }

Redux DevTools

为了开启 Redux DevTools 扩展,使用 window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ 或者 import redux-devtools-extension npm package

  1. import { compose } from 'redux'; // and your other imports from before
  2. const epicMiddleware = createEpicMiddleware(pingEpic);
  3. const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
  4. const store = createStore(pingReducer,
  5. composeEnhancers(
  6. applyMiddleware(epicMiddleware)
  7. )
  8. );