2017-10-11 34 views
1

我使用的是redux-observable,在我的史诗中我使用browserHistory.push改变其中一些路线。这是标准/良好做法吗?我的直觉告诉不,但是需要你的意见。除了升级到react-router 4之后,我无法访问browserHistory,我该怎么做?是可以改变路线编程方式在可观察到的史诗内

回答

1

必须呼吁browserHistory.push()是完全没问题的。如果它适用于您的用例,并且您不需要知道减速器中的路由更改,继续!

这就是说,“纯粹”的方式将是你的史诗般的发出一个动作,将导致路线变化。这可以在react-router v4中使用新的react-router-redux来完成,它取代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()等在反应路由器,终极版是行动的创作者 - 又名行动工厂。它们本身并不会真正导致路线改变,或者完全没有任何副作用。他们返回需要发送的行动,以便改变路线。


使用动作来表示路由改变意图的另一个好处是可测试性。你不再需要模拟一个历史API,你可以断言史诗会发出预期的动作。这就是所谓的“作为数据的效果”,因为你的代码没有执行实际的副作用,你只是产生了意图。

+0

我正在使用react-router-redux,但是在升级软件包后它停止工作,而新版本仍然是测试版,所以我对使用它有点犹豫。 –

+0

完全可以理解。不幸的是,现在你必须在react-router @ 4和react-router-redux @ 5或react-router @ 3和react-router-redux @ 4之间进行选择。所以如果你不想使用react-router-redux的测试版,你必须使用react-router @ 3。无论选择哪种方式,我的答案都适用,因为您会将操作发送给过渡。 Btw可重复观察仍然是测试版;) – jayphelps

+0

@tmpdev是否回答了您的问题? – jayphelps

相关问题