2016-02-29 21 views
28

Sto utilizzando react-redux e standard react-routing. Ho bisogno di reindirizzare dopo un'azione definita.Reindirizza il router di reindirizzamento dopo l'azione redux

Ad esempio: ho registrato alcuni passaggi. E dopo l'azione:

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

Voglio reindirizzare alla pagina con registrationStep2. Come farlo?

p.s. Nel browser storico '/ registrationStep2' non è mai stato. Questa pagina viene visualizzata solo dopo la pagina di registrazione dei risultati riuscita nella pagina iniziale.

risposta

36

Con Reagire Router 2+, ovunque vi invio l'azione, è possibile chiamare browserHistory.push() (o hashHistory.push() se è quello che si usa):

import { browserHistory } from 'react-router' 

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

Si può fare questo da creatori di azione asincrona anche se questo è quello che usi.

+0

quali sono i vantaggi usando redux-router in futuro, che ora è in beta? – ximet

+4

Se si desidera avere sequenze di routing di replay di Redux DevTools, è necessario scegliere tra https://github.com/acdlite/redux-router e https://github.com/reactjs/react-router-redux. In questo caso, consiglierei https://github.com/reactjs/react-router-redux perché è più stabile e molto più semplice. –

+0

@DanAbramov come possiamo eseguire un reindirizzamento dopo un'azione come richiesta da ximet? è corretto fare una "spinta" nel riduttore che gestisce REGISTER_STEP1_SUCCESS? –

14

Avete controllato react-router-redux? Questa libreria consente di sincronizzare react-router con redux.

Ecco un esempio della documentazione di come è possibile implementare il reindirizzamento con un'azione push da react-router-redux.

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

Lo so routing. Ma, mi chiedo, è possibile utilizzare l'instradamento reattivo standard – ximet

+13

E come reindirizzare sull'altra pagina dopo l'azione (usando react-router-redux)? – ximet

+0

È possibile accedere al negozio all'interno del riduttore? – Ante

2

Per costruire su di Eni Arinde risposta precedente (non ho la reputazione di commentare), ecco come utilizzare il metodo store.dispatch dopo un'azione asincrona:

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

Il trucco è quello di fare in i file di azione e non nei riduttori, poiché i riduttori non dovrebbero avere effetti collaterali.

+0

Anche se questa soluzione funziona, le azioni non dovrebbero essere a conoscenza del routing su tutti gli IMO. Dovresti essere in grado di inviare un'azione senza alcun instradamento. – wintercounter

+0

È questo un modo giusto per affrontare il problema? Dovremmo passare l'oggetto cronologia dal componente al creatore di azioni per il routing? –

Problemi correlati