是否可以在redux-observable的epic中以编程方式更改路径

时间:2017-10-11 03:34:46

标签: react-router redux-observable

我正在使用redux-observable,在我的史诗中,我正在使用browserHistory.push更改其中一些路径。这是标准/良好做法吗?我的直觉告诉不,但需要你的意见。除了这个升级到react-router 4后,我无法访问browserHistory我该怎么做?

1 个答案:

答案 0 :(得分:2)

迫切地呼吁browserHistory.push()完全没问题。如果它适用于您的用例,并且您不需要了解减速器中的路线变化,请继续!

也就是说,“纯粹主义”的方式是让你的史诗发出一个会导致路线改变的动作。这可以通过使用新的react-router-redux在react-router v4中完成,old one with the same name取代pd.cut

添加后,您可以使用提供的操作创建者:

import { push } from 'react-router-redux';

export const somethingEpic = action$ =>
  action$.ofType(SOMETHING)
    .switchMap(() => {
      somethingLikeAjaxOrWhatever()
        .mergeMap(response => Observable.of(
          somethingFulfilled(response),
          push('/success-page')
        ))
    });

要清楚,react-router-redux中的push() replace()等是动作创建者 - 也就是动作工厂。它们实际上并不会导致路线自行更改,或者根本不会执行任何副作用。他们返回一个需要以某种方式调度的行动,以便改变路线。

使用动作来发出路径变化意图信号的另一个好处是可测试性。您不再需要模拟历史API,您可以断言史诗发出预期的操作。这被称为“效果为数据”,因为您的代码不会执行实际的副作用,您只需生成意图。