是否可以在 redux-observable 的史诗中以编程方式更改路线

tmp*_*dev 5 react-router redux-observable

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

jay*_*lps 3

命令式调用browserHistory.push()完全没问题。如果它适用于您的用例并且您不需要了解减速器中的路线更改,请继续!

也就是说,“纯粹”的方式是让你的史诗发出一个会导致路线改变的动作。这可以在react-router v4中通过使用新的react-router-redux来完成,它取代了同名的旧版本

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

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

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

需要明确的是,push() replace()react-router-redux 中的 etc 是动作创建者——又名动作工厂。它们本身实际上不会导致路线改变,也不会产生任何副作用。他们返回一个需要以某种方式调度才能改变路线的操作。


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