react-router - 可以在 redux-observable 的史诗中以编程方式更改路线吗

标签 react-router redux-observable

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

最佳答案

紧急调用 browserHistory.push()完全没问题。如果它适用于您的用例并且您不需要知道 reducer 中的路由更改,请继续!

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

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

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

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

要清楚,push() replace() react-router-redux 中的等是 Action 创建者——也就是 Action 工厂。它们实际上不会自己改变路线,也不会产生任何副作用。它们返回一个需要以某种方式调度以改变路由的 Action 。

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

关于react-router - 可以在 redux-observable 的史诗中以编程方式更改路线吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46679349/

相关文章:

reactjs - 错误 : [AdminRoute] is not a <Route> component. <Routes> 的所有子组件必须是 <Route> 或 <React.Fragment>

javascript - react 路由中的错误404

rxjs - 当其他史诗正在运行时是否可以执行 `skip` ?

ajax - 使用 fetch 而不是带有 redux-observable 的 ajax

javascript - RXJS redux observable 执行多个 api 调用

rxjs - Redux Observables/RxJS : How to make epic that returns different actions based on if/else?

javascript - 在 React Router v4 中的嵌套交换机之间移动

javascript - 无法通过 react 路由器将 Prop 传递给组件

reactjs - React-Router 中使用的类型/大小写错误

rxjs - 取消之前的请求,只使用 redux observable 触发最新的请求