2017-12-19 5 views
0

Hallo und danke im Voraus für das Lesen meiner Frage.Warte auf Redux-Aktion, um eine zweite zu senden

Ich arbeite an einer React App (Version 16) mit Router v3 und Redux.

Die App hat eine ähnliche Struktur wie folgt aus:

<Route path="/" component={BakeryComponent}> 
    <IndexRoute component={LandingComponent}/> 
    <Route path="employees" component={EmployeesComponent}/> 
    <Route path="clients" component={ClientComponent}/> 
</Route> 

So haben wir wie verschiedene Einheiten. Bäckerei, die die wichtigste ist, Mitarbeiter, die auf die ausgewählte Bäckerei und Kunden angewiesen ist, die auch von der Bäckerei abhängt.

Wenn wir auf die App zugreifen, landen wir auf der Landing-Page, die allgemeine Informationen der Bäckerei zeigt (es ist eine standardmäßig ausgewählt) wie Name, Mitarbeiter Menge und einige andere. Alle diese Informationen stammen aus dem Backend, sie werden im componentDidMount der Bakery- oder Landing-Komponente abgerufen (an dieser Stelle macht es keinen Unterschied).

Wenn der Benutzer auf der Zielseite ist, kann er zu den Ansichten von Mitarbeitern oder Kunden navigieren. Wenn dies geschieht, wird die Komponente gemountet, angenommen, es handelt sich um eine Mitarbeiterkomponente, und in der componentDidMount-Methode der Komponente rufen wir die benötigten Informationen ab (in diesem Fall die Mitarbeiterliste).

Alles funktioniert gut bis jetzt.

Jetzt, wenn der Benutzer die Seite aktualisiert, sollte alles noch funktionieren (es ist eine Voraussetzung), aber es tut es nicht. Das Problem besteht darin, dass BakeryComponent und EmployeeComponent (beide) dann erneut bereitgestellt werden, sodass neue Back-End-Aufrufe ausgelöst werden (parallel). Aber der Back-End-Aufruf an die Mitarbeiter hängt davon ab, dass die Bäckerei zuerst aufgelöst wird, weil wir die Mitarbeiter wissen müssen, welche Bäckerei wir haben wollen, so dass wir an dieser Stelle einen Fehler bekommen.

Ich habe versucht, die aufgerufene Aktion (die zum Abrufen der Mitarbeiter) zu überprüfen, wenn die Bäckerei bereits aufgelöst wurde (mit getState) und wenn nicht, warten Sie, bis es gelöst wurde. Aber es überzeugt mich nicht, es sieht irgendwie wie ein Hack aus. Ich habe das Gefühl, dass React/Redux bereits die Tools haben sollte, um das zu lösen, aber ich kenne sie einfach nicht. Habe ich recht?

Jede Hilfe wird sehr hilfreich sein.

Danke!

+1

Check this out - [Redux Async Actions] (https://redux.js.org/docs/advanced/AsyncActions.html). Oder genauer gesagt [Async Action Creators] (https://redux.js.org/docs/advanced/AsyncActions.html#async-action-creators). –

+0

Danke, aber ich habe diese beiden Links schon gelesen. Mein Problem ist nicht Async-Aktionen, mein Problem ist, dass ich sie irgendwie serialisieren muss, denke ich, aber ich bin mir nicht sicher. – DiegoTArg

+0

Wenn Sie die Antwort vom ersten API-Aufruf für den zweiten API-Aufruf benötigen, lösen asynchrone Aktionen dieses Problem. –

Antwort

1

Ich kann einen Weg für Sie denken, obwohl es eigentlich keine coole Lösung ist. Sie können überprüfen, ob die Daten in der BakeryComponent bereit sind oder nicht, bevor Sie den Versand in der LandingComponent aufrufen. Etwas wie folgt aus:

BakeryComponent

componentDidMount() { 
    // after this one finish we may have something in the store like: state.bakery.loaded = true 
    dispatch(loadBakery()) 
} 

LandingComponent

// Landing component should connect to state.bakery.loaded to get updated data 
componentDidMount() { 
    initData() 
} 

componentDidUpdate(){ 
    initData() 
} 

initData() { 
    // check if bakery loaded and landing data is not loaded 
    if (state.bakery.loaded && !state.landing.loaded) { 
    // this should load data and set the state.landing.loaded to true 
    dispatch(loadLanding()) 
    } 
} 
+0

Kommentare von Sujit.Warrier und der letzte Kommentar von Kyle Richardson in meiner ursprünglichen Frage sind ebenfalls nützlich, aber ich werde diese Antwort als "die Antwort" auswählen, weil es funktioniert, es ist pure Reaktion (nicht für lokalen Speicher zum Beispiel) und zeigt Anstrengung vom Autor. – DiegoTArg

Verwandte Themen