2016-02-29 105 views
28

我正在使用react-redux和標準react-routing。確定行動後我需要重定向。React路由器redirect後重定向

例如:我已經註冊了幾個步驟。並採取行動後:

function registerStep1Success(object) { 
    return { 
     type: REGISTER_STEP1_SUCCESS, 
     status: object.status 
    }; 
} 

我想讓他重定向到與registrationStep2頁面。怎麼做?

p.s.在歷史瀏覽器'/ registrationStep2'中從未如此。此頁面僅在成功結果registrationStep1頁面後出現。

回答

36

與之反應路由器2+,只要你發送的動作,你可以調用browserHistory.push()(或hashHistory.push()如果這是你用什麼):

import { browserHistory } from 'react-router' 

// ... 
this.props.dispatch(registerStep1Success()) 
browserHistory.push('/registrationStep2') 

您可以從異步操作的創造者做太多,如果這是你使用的。

+0

未來使用redux-router有什麼好處,現在處於測試階段? – ximet

+4

如果您想要Redux DevTools重播路由轉換,您需要在https://github.com/acdlite/redux-router和https://github.com/reactjs/react-router-redux之間進行選擇。在這種情況下,我會推薦https://github.com/reactjs/react-router-redux,因爲它更穩定,更簡單。 –

+0

@DanAbramov ximet提問後,我們如何才能做出重定向?是否正確地在處理REGISTER_STEP1_SUCCESS的reducer中執行「push」? –

14

你簽出了react-router-redux?這個庫使同步react-router和redux成爲可能。

下面是一個文檔示例,介紹如何通過react-router-redux的push操作實現重定向。

import { routerMiddleware, push } from 'react-router-redux' 

// Apply the middleware to the store 
const middleware = routerMiddleware(browserHistory) 
const store = createStore(
    reducers, 
    applyMiddleware(middleware) 
) 

// Dispatch from anywhere like normal. 
store.dispatch(push('/foo')) 
+0

我知道它的路由。但是,我不知道是否有可能使用標準的react-routing – ximet

+13

以及action之後的其他頁面如何重定向(使用react-router-redux)。 – ximet

+0

您可以訪問減速機內的商店嗎? – Ante

2

要建立在埃尼Arinde以前的答案是(我沒有信譽評論),這裏是如何一個異步操作後使用store.dispatch方法:

export function myAction(data) { 
    return (dispatch) => { 
     dispatch({ 
      type: ACTION_TYPE, 
      data, 
     }).then((response) => { 
      dispatch(push('/my_url')); 
     }); 
    }; 
} 

關鍵是要做到在行動文件,而不是減速器,因爲減速器不應該有副作用。

+0

即使此解決方案有效,操作也不應該知道所有IMO的路由。你應該能夠在沒有任何路由的情況下發送一個動作。 – wintercounter

+0

這是解決問題的正確方法嗎?我們是否應該將歷史對象從組件傳遞給動作創建者進行路由? –