2017-10-11 32 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

相關問題