2016-02-29 10 views
28

Ich benutze react-redux und Standard react-Routing. Ich muss nach einer bestimmten Aktion umleiten.Reactor Router Redirect nach Aktion Redux

Zum Beispiel: Ich habe Registrierung ein paar Schritte. Und nach der Aktion:

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

Ich möchte ihn umleiten, um Seite mit RegistrierungStep2 Seite. Wie es geht?

p.s. In der Geschichte Browser '/ registrationStep2' war noch nie. Diese Seite wird nur nach erfolgreicher ErgebnisregistrierungStep1-Seite angezeigt.

Antwort

36

Mit React Router 2+, wo Sie die Aktion versenden, können Sie browserHistory.push() nennen (oder hashHistory.push() wenn das, was Sie verwenden):

import { browserHistory } from 'react-router' 

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

Sie können dies von Asynchron-Aktion Schöpfer auch wenn das ist was du benutzt.

+0

Was sind die Vorteile von Redux-Router in der Zukunft, die jetzt in der Betaversion? – ximet

+4

Wenn Sie Redux DevTools Replay-Routing-Übergänge haben möchten, müssen Sie zwischen https://github.com/acdlite/redux-router und https://github.com/reactjs/react-router-redux wählen. In diesem Fall würde ich https://github.com/reactjs/react-router-redux empfehlen, da es stabiler und viel einfacher ist. –

+0

@DanAbramov Wie können wir eine Weiterleitung nach einer Aktion tun, wie Ximet fragt? Ist das korrekt, um einen "Push" im Reduzierer zu machen, der REGISTER_STEP1_SUCCESS bearbeitet? –

14

Haben Sie react-router-redux ausgecheckt? Diese Bibliothek ermöglicht es, react-router mit redux zu synchronisieren.

Hier ist ein Beispiel aus der Dokumentation, wie Sie die Umleitung mit einer Push-Aktion von react-router-redux implementieren können.

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

Ich weiß darüber Routing. Aber, ich frage mich, ist es möglich, Standard-react-routing – ximet

+13

Und wie Redirect auf der anderen Seite nach Aktion (mit react-Router-Redux) zu verwenden. – ximet

+0

Können Sie auf Laden innerhalb des Reduzierstücks zugreifen? – Ante

2

aufbauen Eni Arinde vorherige Antwort der (I Kommentar nicht den Ruf hat), ist hier, wie die store.dispatch Verfahren nach einer Asynchron-Aktion verwenden:

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

Der Trick, es zu tun ist in die Actionfiles und nicht in den Reducern, da Reducer keine Nebenwirkungen haben sollten.

+0

Auch wenn diese Lösung funktioniert, sollten Aktionen das Routing bei IMO nicht berücksichtigen. Sie sollten in der Lage sein, eine Aktion ohne Routing zu versenden. – wintercounter

+0

Ist dies ein richtiger Weg, um das Problem anzugehen? Sollten wir das Verlaufsobjekt von der Komponente an den Aktionsersteller für das Routing übergeben? –

Verwandte Themen