2016-07-14 7 views
13

Angenommen, ich habe eine Link, die mich auf eine Seite zum Hinzufügen/Bearbeiten eines Listeneintrags schickt.Wie verschicke ich eine Aktion, wenn ich bei der Verwendung von React-Router & Redux auf Link klicke?

Wie versende ich eine Redux-Aktion, wenn ich auf die Link selbst klicke, damit ich den Redux-Speicher zuerst aktualisieren kann, bevor ich tatsächlich auf diese Seite umgeleitet werde.

ZB: Ich klicke auf Bearbeiten Schaltfläche -> Aktion wird ausgelöst -> Store aktualisiert, {'state': 'edit-mode'} -> Weiterleiten umleiten.

Oder haben Sie einen anderen Weg, um zu erreichen, was ich versuche zu tun?

Vielleicht, wenn Komponente montiert ist, dann werde ich eine Aktion wie stateToEdit basierend auf bestimmten Bedingungen ausführen? Wenn ja, dann zeige mir bitte deinen Weg. Danke

PS: Ich benutze nur eine Komponente für alle hinzufügen/bearbeiten/löschen. Also ich bin eine Art und Weise zu denken zu machen, auf der Grundlage der state ob seine auf edit-mode oder delete-mode usw.

+4

Anstatt 'Link' zu verwenden, können Sie' browserHistory.push (path) 'mit der onClick-Funktion verwenden. Verteilen Sie Ihre Aktion in dieser Funktion und drücken Sie dann auf den neuen Speicherort. – lux

+0

Ich dachte auch an so etwas, aber ich bin mir nicht sicher, ob dies der richtige Weg ist, um das Problem zu lösen. Ich schätze, ich werde diese Methode für jetzt verwenden. Wenn es andere Wege gibt, würde ich es gerne wissen. Danke –

+1

Ein geeigneterer Weg, um dieses Problem anzugehen, könnte sein, "Redux-Thunk" einzuführen, was wahrscheinlich helfen würde, den Code ein wenig mehr zu organisieren, wenn man diese Aktion "Versenden, dann auf eine andere Seite verschieben" an verschiedenen Stellen ausführen möchte .Werfen Sie einen Blick auf Dans Antwort hier, ich bin mir sicher, dass es die Gänge drehen wird, wie Sie das Problem in Ihrem Kontext angehen könnten: http://stackoverflow.com/questions/35493352/cani-i-dispatch-multiple- actions-ohne-redux-thunk-middleware/35642783 # 35642783 – lux

Antwort

12

Hier sind ein paar Möglichkeiten, wie Sie zur Adressierung dieses Problems gehen könnten:

  1. Statt Link zu verwenden, Versuchen Sie es mit browserHistory.push(path) mit einer onClick Funktion.
    • Im Inneren des onClick, können Sie Ihre Aktion dispatch, dann push an einen neuen Standort.
    • Wenn Sie jedoch diese Reihe von Aktionen in verschiedenen Komponenten ausführen möchten, werden Sie wahrscheinlich Codeduplizierung erleiden.
  2. Eine robustere Art und Weise dieses Problem zu beheben wäre redux-thunk zu implementieren, die zur Durchführung mehrerer „Aktionen“ eine generische Art und Weise bietet (sei es eine Redux Aktion aufrufen oder einen Asynchron-Betrieb durchgeführt wird, oder beides!) In Antwort auf eine Änderung.
    • Dan hat eine große Resonanz hier Hervorhebung der Einfachheit der redux-thunk bietet tatsächlich: Can I dispatch multiple actions without Redux Thunk middleware?
    • In Ihrem Fall in der incrementTwice Funktion, Stellen Sie sich nur mit einem Aufruf an browserHistory.push(action.path), ähnlich dem einer der dispatch(increment) Anrufe zu ersetzen unten:

Redux thunk Aktion

export const dispatchThenRoute = (myAction, myPath) => { 
    return (dispatch) => { 
     dispatch(myAction) 
     browserHistory.push(myPath); 
    } 
}; 
+0

Link Prefetch funktioniert nicht, wenn wir mit diesem Ansatz gehen. Hab ich recht? Oder wie es funktioniert! – myDoggyWritesCode