Ich habe eine Aktion, die den Benachrichtigungsstatus meiner Anwendung aktualisiert. Normalerweise handelt es sich bei dieser Benachrichtigung um einen Fehler oder eine Information. Ich muss dann nach 5 Sekunden eine weitere Aktion auslösen, die den Benachrichtigungsstatus auf den ursprünglichen Status zurücksetzt, also keine Benachrichtigung. Der Hauptgrund dafür ist die Bereitstellung von Funktionen, bei denen Benachrichtigungen nach 5 Sekunden automatisch ausgeblendet werden.
Ich hatte kein Glück damit, eine setTimeout
andere Aktion zu verwenden und zurückzugeben, und kann nicht herausfinden, wie dies online gemacht wird. Jeder Rat ist also willkommen.
redux-saga
Antwort zu überprüfen , wenn du etwas Besseres als Thunks willst. Eine späte Antwort, sodass Sie lange scrollen müssen, bevor Sie sie sehen können :) bedeutet nicht, dass es nicht lesenswert ist. Hier ist eine Verknüpfung: stackoverflow.com/a/38574266/82609Antworten:
Fallen Sie nicht in die Falle, wenn Sie denken, eine Bibliothek sollte vorschreiben, wie alles zu tun ist . Wenn Sie etwas mit einer Zeitüberschreitung in JavaScript tun möchten, müssen Sie verwenden
setTimeout
. Es gibt keinen Grund, warum Redux-Aktionen anders sein sollten.Redux nicht bieten einige alternative Möglichkeiten, mit asynchronen Sachen zu tun, aber Sie sollten nur diejenigen verwenden , wenn Sie merken , Sie sind zu viel Code wiederholen. Wenn Sie dieses Problem nicht haben, verwenden Sie das, was die Sprache bietet, und wählen Sie die einfachste Lösung.
Async-Code inline schreiben
Dies ist bei weitem der einfachste Weg. Und hier gibt es nichts Spezielles für Redux.
Ebenso aus dem Inneren einer verbundenen Komponente:
Der einzige Unterschied besteht darin, dass Sie in einer verbundenen Komponente normalerweise keinen Zugriff auf das Geschäft selbst haben, sondern entweder
dispatch()
oder bestimmte Aktionsersteller als Requisiten injiziert bekommen. Dies macht jedoch für uns keinen Unterschied.Wenn Sie beim Versenden derselben Aktionen aus verschiedenen Komponenten keine Tippfehler machen möchten, möchten Sie möglicherweise Aktionsersteller extrahieren, anstatt Aktionsobjekte inline zu versenden:
Oder, wenn Sie sie zuvor gebunden haben mit
connect()
:Bisher haben wir keine Middleware oder ein anderes fortschrittliches Konzept verwendet.
Async Action Creator extrahieren
Der obige Ansatz funktioniert in einfachen Fällen einwandfrei, es kann jedoch vorkommen, dass einige Probleme auftreten:
HIDE_NOTIFICATION
und die zweite Benachrichtigung wird fälschlicherweise früher als nach dem Timeout ausgeblendet.Um diese Probleme zu lösen, müssten Sie eine Funktion extrahieren, die die Timeout-Logik zentralisiert und diese beiden Aktionen auslöst. Es könnte so aussehen:
Jetzt können Komponenten verwendet werden,
showNotificationWithTimeout
ohne diese Logik zu duplizieren oder Rennbedingungen mit unterschiedlichen Benachrichtigungen zu haben:Warum
showNotificationWithTimeout()
akzeptiertdispatch
als erstes Argument? Weil es Aktionen an das Geschäft senden muss. Normalerweise hat eine Komponente Zugriff auf,dispatch
aber da eine externe Funktion die Kontrolle über den Versand übernehmen soll, müssen wir ihr die Kontrolle über den Versand geben.Wenn Sie einen Singleton-Speicher aus einem Modul exportieren ließen, können Sie ihn einfach importieren und
dispatch
stattdessen direkt darauf:Das sieht einfacher aus, aber wir empfehlen diesen Ansatz nicht . Der Hauptgrund, warum wir es nicht mögen, ist, dass es den Speicher zwingt, ein Singleton zu sein . Dies macht es sehr schwierig, das Server-Rendering zu implementieren . Auf dem Server soll jede Anforderung einen eigenen Speicher haben, damit verschiedene Benutzer unterschiedliche vorinstallierte Daten erhalten.
Ein Singleton-Store erschwert auch das Testen. Sie können einen Speicher nicht mehr verspotten, wenn Sie Aktionsersteller testen, da diese auf einen bestimmten realen Speicher verweisen, der aus einem bestimmten Modul exportiert wurde. Sie können den Status nicht einmal von außen zurücksetzen.
Obwohl Sie einen Singleton-Speicher technisch aus einem Modul exportieren können, raten wir davon ab. Tun Sie dies nur, wenn Sie sicher sind, dass Ihre App niemals Server-Rendering hinzufügt.
Zurück zur vorherigen Version:
Dies löst die Probleme mit der Verdoppelung der Logik und bewahrt uns vor den Rennbedingungen.
Thunk Middleware
Für einfache Apps sollte der Ansatz ausreichen. Machen Sie sich keine Sorgen um Middleware, wenn Sie damit zufrieden sind.
In größeren Apps können jedoch bestimmte Unannehmlichkeiten auftreten.
Zum Beispiel scheint es bedauerlich, dass wir herumreichen müssen
dispatch
. Dies macht es schwieriger, Container- und Präsentationskomponenten zu trennen, da jede Komponente, die Redux-Aktionen auf die oben beschriebene Weise asynchron auslöst,dispatch
als Requisite akzeptiert werden muss, damit sie sie weitergeben kann. Sie können nicht mehr nur Aktionsersteller binden,connect()
da diesshowNotificationWithTimeout()
nicht wirklich ein Aktionsersteller ist. Es wird keine Redux-Aktion zurückgegeben.Darüber hinaus kann es schwierig sein, sich daran zu erinnern, welche Funktionen synchrone Aktionsersteller
showNotification()
und welche asynchrone Helfer sindshowNotificationWithTimeout()
. Sie müssen sie anders verwenden und darauf achten, sie nicht miteinander zu verwechseln.Dies war die Motivation , einen Weg zu finden, um dieses Muster der Bereitstellung
dispatch
einer Hilfsfunktion zu „legitimieren“ und Redux dabei zu helfen, solche asynchronen Aktionsersteller als Sonderfall normaler Aktionsersteller und nicht als völlig andere Funktionen zu „sehen“ .Wenn Sie noch bei uns sind und auch ein Problem in Ihrer App erkennen, können Sie gerne die Redux Thunk- Middleware verwenden.
Kurz gesagt, Redux Thunk lehrt Redux, spezielle Arten von Aktionen zu erkennen, die tatsächlich Funktionen sind:
Wenn diese Middleware aktiviert ist und Sie eine Funktion versenden , gibt die Redux Thunk-Middleware diese
dispatch
als Argument an. Es wird auch solche Aktionen "schlucken", also machen Sie sich keine Sorgen, dass Ihre Reduzierer seltsame Funktionsargumente erhalten. Ihre Reduzierungen erhalten nur einfache Objektaktionen - entweder direkt oder von den gerade beschriebenen Funktionen.Das sieht nicht sehr nützlich aus, oder? Nicht in dieser besonderen Situation. Wir können uns jedoch
showNotificationWithTimeout()
als regulärer Redux-Aktionsersteller deklarieren :Beachten Sie, dass die Funktion fast identisch mit der im vorherigen Abschnitt beschriebenen ist. Es wird jedoch nicht
dispatch
als erstes Argument akzeptiert . Stattdessen es gibt eine Funktion , die übernimmtdispatch
als erstes Argument.Wie würden wir es in unserer Komponente verwenden? Auf jeden Fall könnten wir das schreiben:
Wir rufen den asynchronen Aktionsersteller auf, um die innere Funktion zu erhalten, die gerecht sein soll
dispatch
, und dann bestehen wirdispatch
.Dies ist jedoch noch umständlicher als die Originalversion! Warum sind wir überhaupt diesen Weg gegangen?
Wegen dem, was ich dir vorher gesagt habe. Wenn die Redux Thunk-Middleware aktiviert ist, ruft die Middleware jedes Mal, wenn Sie versuchen, eine Funktion anstelle eines Aktionsobjekts auszulösen, diese Funktion mit der
dispatch
Methode selbst als erstem Argument auf .Also können wir dies stattdessen tun:
Schließlich sieht das Versenden einer asynchronen Aktion (wirklich eine Reihe von Aktionen) nicht anders aus als das Versenden einer einzelnen Aktion synchron zur Komponente. Das ist gut, weil es Komponenten egal sein sollte, ob etwas synchron oder asynchron passiert. Wir haben das einfach weg abstrahiert.
Da wir Redux „beigebracht“ haben, solche „speziellen“ Aktionsersteller zu erkennen (wir nennen sie Thunk- Aktionsersteller), können wir sie jetzt an jedem Ort verwenden, an dem wir reguläre Aktionsersteller verwenden würden. Zum Beispiel können wir sie verwenden mit
connect()
:Lesestatus in Thunks
Normalerweise enthalten Ihre Reduzierungen die Geschäftslogik zur Bestimmung des nächsten Status. Reduzierungen werden jedoch erst aktiviert, nachdem die Aktionen ausgelöst wurden. Was ist, wenn Sie einen Nebeneffekt (z. B. das Aufrufen einer API) in einem Thunk-Aktionsersteller haben und diesen unter bestimmten Bedingungen verhindern möchten?
Ohne die Thunk-Middleware würden Sie nur diese Überprüfung innerhalb der Komponente durchführen:
Beim Extrahieren eines Aktionserstellers ging es jedoch darum, diese sich wiederholende Logik über viele Komponenten hinweg zu zentralisieren. Glücklicherweise bietet Ihnen Redux Thunk eine Möglichkeit, den aktuellen Status des Redux-Stores zu lesen . Darüber hinaus
dispatch
wird esgetState
als zweites Argument an die Funktion übergeben, die Sie von Ihrem Thunk-Aktionsersteller zurückgeben. Dadurch kann der Thunk den aktuellen Status des Geschäfts lesen.Missbrauche dieses Muster nicht. Es ist gut, um API-Aufrufe zu beenden, wenn zwischengespeicherte Daten verfügbar sind, aber es ist keine sehr gute Grundlage, um auf Ihrer Geschäftslogik aufzubauen. Wenn Sie
getState()
nur verschiedene Aktionen bedingt auslösen, sollten Sie stattdessen die Geschäftslogik in die Reduzierungen einfügen.Nächste Schritte
Nachdem Sie eine grundlegende Vorstellung davon haben, wie Thunks funktionieren, sehen Sie sich das asynchrone Redux- Beispiel an, in dem sie verwendet werden.
Möglicherweise finden Sie viele Beispiele, in denen Thunks Versprechen zurückgeben. Dies ist nicht erforderlich, kann aber sehr praktisch sein. Redux ist es egal, was Sie von einem Thunk zurückgeben, aber es gibt Ihnen den Rückgabewert von
dispatch()
. Aus diesem Grund können Sie ein Versprechen von einem Thunk zurückgeben und warten, bis es abgeschlossen ist, indem Sie anrufendispatch(someThunkReturningPromise()).then(...)
.Sie können komplexe Thunk-Action-Ersteller auch in mehrere kleinere Thunk-Action-Ersteller aufteilen. Die
dispatch
von Thunks bereitgestellte Methode kann Thunks selbst akzeptieren, sodass Sie das Muster rekursiv anwenden können. Auch dies funktioniert am besten mit Promises, da Sie darüber hinaus einen asynchronen Steuerungsfluss implementieren können.Bei einigen Apps befinden Sie sich möglicherweise in einer Situation, in der Ihre Anforderungen an den asynchronen Steuerungsfluss zu komplex sind, um mit Thunks ausgedrückt zu werden. Beispielsweise kann das Wiederholen fehlgeschlagener Anforderungen, der erneute Autorisierungsfluss mit Token oder ein schrittweises Onboarding zu ausführlich und fehleranfällig sein, wenn es auf diese Weise geschrieben wird. In diesem Fall sollten Sie sich erweiterte asynchrone Steuerungsflusslösungen wie Redux Saga oder Redux Loop ansehen . Bewerten Sie sie, vergleichen Sie die für Ihre Bedürfnisse relevanten Beispiele und wählen Sie das aus, das Ihnen am besten gefällt.
Verwenden Sie schließlich nichts (einschließlich Thunks), wenn Sie nicht wirklich das Bedürfnis danach haben. Denken Sie daran, dass Ihre Lösung je nach den Anforderungen so einfach aussehen kann wie
Schwitzen Sie nicht, es sei denn, Sie wissen, warum Sie das tun.
quelle
if (cond) dispatch({ type: 'A' }) else dispatch({ type: 'B' })
, sollten Siedispatch({ type: 'C', something: cond })
die Aktion in Reduzierungen möglicherweise einfach ignorierenaction.something
und stattdessen abhängig vom aktuellen Status ignorieren .Mit Redux-Saga
Wie Dan Abramov sagte, sollten Sie sich die Redux-Saga ansehen, wenn Sie eine erweiterte Kontrolle über Ihren Async-Code wünschen .
Diese Antwort ist ein einfaches Beispiel. Wenn Sie bessere Erklärungen dazu wünschen, warum Redux-Saga für Ihre Anwendung nützlich sein kann, überprüfen Sie diese andere Antwort .
Die allgemeine Idee ist, dass Redux-Saga einen ES6-Generator-Interpreter bietet, mit dem Sie einfach asynchronen Code schreiben können, der wie synchroner Code aussieht (aus diesem Grund finden Sie in Redux-Saga häufig unendliche while-Schleifen). Irgendwie baut die Redux-Saga ihre eigene Sprache direkt in Javascript auf. Die Redux-Saga kann sich zunächst etwas schwierig anfühlen, da Sie ein grundlegendes Verständnis der Generatoren benötigen, aber auch die Sprache der Redux-Saga verstehen müssen.
Ich werde hier versuchen, hier das Benachrichtigungssystem zu beschreiben, das ich auf der Redux-Saga aufgebaut habe. Dieses Beispiel läuft derzeit in der Produktion.
Erweiterte Benachrichtigungssystemspezifikation
Ergebnis
Screenshot meiner Produktions-App Stample.co
Code
Hier habe ich die Benachrichtigung a genannt,
toast
aber dies ist ein Namensdetail.Und der Reduzierer:
Verwendungszweck
Sie können einfach
TOAST_DISPLAY_REQUESTED
Ereignisse auslösen . Wenn Sie 4 Anfragen versenden, werden nur 3 Benachrichtigungen angezeigt, und die vierte wird etwas später angezeigt, sobald die erste Benachrichtigung verschwindet.Beachten Sie, dass ich den Versand
TOAST_DISPLAY_REQUESTED
von JSX nicht ausdrücklich empfehle . Sie möchten lieber eine weitere Saga hinzufügen, die Ihre bereits vorhandenen App-Ereignisse abhört, und dann Folgendes versendenTOAST_DISPLAY_REQUESTED
: Ihre Komponente, die die Benachrichtigung auslöst, muss nicht eng mit dem Benachrichtigungssystem verbunden sein.Fazit
Mein Code ist nicht perfekt, läuft aber monatelang mit 0 Fehlern in der Produktion. Redux-Saga und Generatoren sind anfangs etwas schwierig, aber sobald Sie sie verstanden haben, ist diese Art von System ziemlich einfach zu bauen.
Es ist sogar recht einfach, komplexere Regeln zu implementieren, wie zum Beispiel:
Ehrlich gesagt, viel Glück beim richtigen Implementieren dieser Art von Dingen mit Thunks.
Beachten Sie, dass Sie mit Redux-Observable genau das Gleiche tun können, was der Redux-Saga sehr ähnlich ist. Es ist fast das gleiche und ist Geschmackssache zwischen Generatoren und RxJS.
quelle
yield call(delay,timeoutValue);
: Es ist nicht die gleiche API, aber es hat den gleichen EffektEin Repository mit Beispielprojekten
Derzeit gibt es vier Beispielprojekte:
Die akzeptierte Antwort ist fantastisch.
Aber es fehlt etwas:
Also habe ich das Hello Async- Repository erstellt, um die fehlenden Dinge hinzuzufügen:
Redux Saga
Die akzeptierte Antwort enthält bereits Beispielcode-Snippets für Async Code Inline, Async Action Generator und Redux Thunk. Der Vollständigkeit halber stelle ich Code-Schnipsel für Redux Saga zur Verfügung:
Aktionen sind einfach und rein.
Mit Komponenten ist nichts Besonderes.
Sagas basieren auf ES6-Generatoren
Im Vergleich zu Redux Thunk
Vorteile
Nachteile
Bitte beziehen Sie sich auf das ausführbare Projekt, wenn die obigen Codefragmente nicht alle Ihre Fragen beantworten.
quelle
Sie können dies mit Redux-Thunk tun . Im Redux-Dokument gibt es eine Anleitung für asynchrone Aktionen wie setTimeout.
quelle
applyMiddleware(ReduxPromise, thunk)(createStore)
, fügen Sie auf diese Weise mehrere Middleware hinzu (durch Koma getrennt?), Da ich anscheinend keinen Thunk zum Laufen bringen kann.const store = createStore(reducer, applyMiddleware([ReduxPromise, thunk]));
Ich würde empfehlen, auch das SAM-Muster zu betrachten .
Das SAM-Muster befürwortet die Aufnahme eines "Prädikats für die nächste Aktion", bei dem (automatische) Aktionen wie "Benachrichtigungen verschwinden automatisch nach 5 Sekunden" ausgelöst werden, sobald das Modell aktualisiert wurde (SAM-Modell ~ Reduzierungsstatus + Speicher).
Das Muster befürwortet die Sequenzierung von Aktionen und Modellmutationen nacheinander, da der "Kontrollstatus" des Modells "steuert", welche Aktionen vom Prädikat für die nächste Aktion aktiviert und / oder automatisch ausgeführt werden. Sie können einfach (im Allgemeinen) nicht vorhersagen, in welchem Zustand sich das System befindet, bevor eine Aktion verarbeitet wird, und daher, ob Ihre nächste erwartete Aktion zulässig / möglich ist.
So zum Beispiel der Code,
wäre mit SAM nicht zulässig, da die Tatsache, dass eine hideNotification-Aktion ausgelöst werden kann, davon abhängt, dass das Modell den Wert "showNotication: true" erfolgreich akzeptiert. Es könnte andere Teile des Modells geben, die verhindern, dass es akzeptiert wird, und daher gibt es keinen Grund, die Aktion hideNotification auszulösen.
Ich würde dringend empfehlen, ein korrektes Prädikat für die nächste Aktion zu implementieren, nachdem die Speicheraktualisierungen und der neue Steuerungsstatus des Modells bekannt sind. Dies ist der sicherste Weg, um das gesuchte Verhalten zu implementieren.
Sie können sich uns auf Gitter anschließen, wenn Sie möchten. Hier finden Sie auch eine SAM-Anleitung für die ersten Schritte .
quelle
V = S( vm( M.present( A(data) ) ), nap(M))
ist einfach wunderschön. Vielen Dank für Ihre Gedanken und Erfahrungen. Ich werde tiefer graben.Nachdem ich die verschiedenen gängigen Ansätze ausprobiert hatte (Action-Ersteller, Thunks, Sagen, Epen, Effekte, benutzerdefinierte Middleware), hatte ich immer noch das Gefühl, dass möglicherweise Verbesserungspotenzial besteht, und dokumentierte meine Reise in diesem Blog-Artikel: Wo stelle ich meine Geschäftslogik ein? eine React / Redux-Anwendung?
Ähnlich wie bei den Diskussionen hier habe ich versucht, die verschiedenen Ansätze gegenüberzustellen und zu vergleichen. Schließlich führte es mich zur Einführung einer neuen Bibliotheksredux -Logik, die sich von Epen, Sagen und benutzerdefinierter Middleware inspirieren lässt.
Sie können damit Aktionen abfangen, um sie zu validieren, zu überprüfen, zu autorisieren und asynchrone E / A-Vorgänge auszuführen.
Einige allgemeine Funktionen können einfach deklariert werden, z. B. Entprellen, Drosseln, Abbrechen und nur mithilfe der Antwort der letzten Anforderung (takeLatest). Redux-Logik umschließt Ihren Code und bietet diese Funktionalität für Sie.
So können Sie Ihre Kerngeschäftslogik nach Belieben implementieren. Sie müssen keine Observablen oder Generatoren verwenden, es sei denn, Sie möchten. Verwenden Sie Funktionen und Rückrufe, Versprechen, asynchrone Funktionen (async / await) usw.
Der Code für eine einfache 5s-Benachrichtigung lautet wie folgt:
Ich habe ein erweitertes Benachrichtigungsbeispiel in meinem Repo, das ähnlich wie das von Sebastian Lorber beschriebene funktioniert, bei dem Sie die Anzeige auf N Elemente beschränken und durch alle Elemente in der Warteschlange drehen können. Beispiel für eine Redux-Logik-Benachrichtigung
Ich habe eine Vielzahl von Redux-Logik-Jsfiddle-Live-Beispielen sowie vollständige Beispiele . Ich arbeite weiterhin an Dokumenten und Beispielen.
Ich würde gerne Ihr Feedback hören.
quelle
Ich verstehe, dass diese Frage etwas alt ist, aber ich werde eine andere Lösung mit Redux-Observable aka vorstellen . Epos.
Zitieren der offiziellen Dokumentation:
Was ist Redux-beobachtbar?
Ein Epos ist das Kernprimitiv von Redux-Observable.
Mit mehr oder weniger Worten können Sie eine Funktion erstellen, die Aktionen über einen Stream empfängt und dann einen neuen Stream von Aktionen zurückgibt (unter Verwendung allgemeiner Nebenwirkungen wie Zeitüberschreitungen, Verzögerungen, Intervalle und Anforderungen).
Lassen Sie mich den Code posten und dann etwas mehr darüber erklären
store.js
index.js
App.js.
Der Schlüsselcode zur Lösung dieses Problems ist so einfach wie Sie sehen können. Das einzige, was sich von den anderen Antworten unterscheidet, ist die Funktion rootEpic.
Punkt 1. Wie bei Sagen müssen Sie die Epen kombinieren, um eine Funktion der obersten Ebene zu erhalten, die einen Aktionsstrom empfängt und einen Aktionsstrom zurückgibt, sodass Sie sie mit der Middleware-Factory createEpicMiddleware verwenden können . In unserem Fall brauchen wir nur einen, also haben wir nur unser rootEpic, damit wir nichts kombinieren müssen, aber es ist eine gute Tatsache.
Punkt 2. Unser rootEpic, das sich um die Logik der Nebenwirkungen kümmert, benötigt nur etwa 5 Codezeilen, was großartig ist! Einschließlich der Tatsache, dass ziemlich deklarativ ist!
Punkt 3. Zeile für Zeile rootEpic Erklärung (in Kommentaren)
Ich hoffe, es hilft!
quelle
switchMap
.Warum sollte es so schwer sein? Es ist nur UI-Logik. Verwenden Sie eine spezielle Aktion, um Benachrichtigungsdaten festzulegen:
und eine dedizierte Komponente zur Anzeige:
In diesem Fall sollten die Fragen lauten: "Wie bereinigen Sie den alten Status?", "Wie benachrichtige ich eine Komponente, wenn sich die Zeit geändert hat?"
Sie können eine TIMEOUT-Aktion implementieren, die bei setTimeout von einer Komponente ausgelöst wird.
Vielleicht ist es in Ordnung, es zu reinigen, wenn eine neue Benachrichtigung angezeigt wird.
Wie auch immer,
setTimeout
irgendwo sollte es welche geben , oder? Warum nicht in einer Komponente?Die Motivation ist, dass die Funktion zum Ausblenden von Benachrichtigungen wirklich ein Problem für die Benutzeroberfläche darstellt. Dies vereinfacht das Testen Ihrer Geschäftslogik.
Es scheint nicht sinnvoll zu sein, zu testen, wie es implementiert ist. Es ist nur sinnvoll zu überprüfen, wann die Benachrichtigung abläuft. Also weniger Code zum Stub, schnellere Tests, sauberer Code.
quelle
Wenn Sie bei ausgewählten Aktionen eine Timeout-Behandlung wünschen, können Sie den Middleware- Ansatz ausprobieren . Ich hatte ein ähnliches Problem bei der selektiven Behandlung versprechungsbasierter Aktionen, und diese Lösung war flexibler.
Nehmen wir an, Ihr Action-Ersteller sieht folgendermaßen aus:
Das Zeitlimit kann in der obigen Aktion mehrere Werte enthalten
Ihre Middleware-Implementierung würde folgendermaßen aussehen:
Sie können jetzt alle Ihre Aktionen mithilfe von Redux durch diese Middleware-Ebene leiten.
Ähnliche Beispiele finden Sie hier
quelle
Der geeignete Weg, dies zu tun, ist die Verwendung von Redux Thunk , einer für Middlex beliebten Middleware gemäß der Redux Thunk-Dokumentation:
Im Grunde gibt es eine Funktion zurück, und Sie können Ihren Versand verzögern oder in einen Zustandszustand versetzen.
So etwas wird den Job für Sie erledigen:
quelle
Es ist einfach. Verwenden Sie das Trim-Redux- Paket und schreiben Sie so an
componentDidMount
oder an eine andere Stelle und töten Sie escomponentWillUnmount
.quelle
Redux selbst ist eine ziemlich ausführliche Bibliothek, und für solche Dinge müssten Sie etwas wie Redux-thunk verwenden , das eine
dispatch
Funktion gibt, damit Sie das Schließen der Benachrichtigung nach einigen Sekunden versenden können.Ich habe eine Bibliothek erstellt , um Probleme wie Ausführlichkeit und Kompositionsfähigkeit zu beheben. Ihr Beispiel sieht folgendermaßen aus:
Daher erstellen wir Synchronisierungsaktionen, um Benachrichtigungen innerhalb einer asynchronen Aktion anzuzeigen, die Informationen zum Hintergrund anfordern oder später überprüfen können, ob die Benachrichtigung manuell geschlossen wurde.
quelle