Wie setzen Sie den Status einer Redux-Shop?
Bin ich mit Redux für die Staatliche Verwaltung.
Wie setze ich den laden, um den ursprünglichen Zustand?
Zum Beispiel, sagen wir, ich habe zwei Benutzerkonten (u1
und u2
).
Stellen Sie sich die folgende Sequenz von Ereignissen:
- Benutzer
u1
Protokolle in die app und tut etwas, so dass wir den cache einige Daten im Speicher. - Benutzer
u1
abmeldet. - Benutzer
u2
Protokolle in die app ohne Aktualisierung des Browsers.
Zu diesem Zeitpunkt, dass die zwischengespeicherte Daten werden im Zusammenhang mit u1
, und ich möchte, um es zu säubern.
Wie kann ich zurücksetzen der Redux-Shop in seinen ursprünglichen Zustand, wenn der erste Benutzer sich ausloggt?
Es ist wahrscheinlich besser, klar der Staat auf logout statt (aus Sicht der Sicherheit)
Nicht Bearbeiten Sie Ihre Frage zum zählen der Lösung. Akzeptieren einer Antwort, die ist gut genug. Sie könnten auch selbst beantworten mit Ihren spezifischen Lösung, wenn Sie glauben, Sie hat eine Menge Zeug, um die bereits vorhandene Antworten. In der Zwischenzeit habe ich entfernt, die nicht-Frage Teil der post.
Nicht Bearbeiten Sie Ihre Frage zum zählen der Lösung. Akzeptieren einer Antwort, die ist gut genug. Sie könnten auch selbst beantworten mit Ihren spezifischen Lösung, wenn Sie glauben, Sie hat eine Menge Zeug, um die bereits vorhandene Antworten. In der Zwischenzeit habe ich entfernt, die nicht-Frage Teil der post.
InformationsquelleAutor xyz | 2016-02-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen Weg, das zu tun, wäre die Erstellung einer root-reducer in Ihrer Anwendung.
Root-Reduzierer normalerweise delegieren Umgang mit der Aktion auf die reducer erzeugt durch
combineReducers()
. Aber immer, wenn es erhältUSER_LOGOUT
Aktion, es gibt den Ausgangszustand wieder.Zum Beispiel, wenn Ihre root-reducer sah so aus:
Können Sie es umbenennen, um
appReducer
und schreiben Sie eine neuerootReducer
delegieren:Nun müssen wir nur noch die lehren der neuen
rootReducer
zurück zu den ursprünglichen Zustand nachUSER_LOGOUT
Aktion. Wie wir wissen, Reduzierstücke sind zurückgeben sollte, den ursprünglichen Zustand, wenn Sie aufgerufen sind, mitundefined
als das erste argument, egal, die Aktion. Lassen Sie uns diese Tatsache bedingt strip die angesammeltestate
wie geben wir es anappReducer
:Nun, wenn
USER_LOGOUT
feuert, alle Reduzierstücke werden neu initialisiert. Sie können sich auch wieder etwas anders als ursprünglich, wenn Sie wollen, weil Sie überprüfen könnenaction.type
als gut.Bekräftigen, die volle neue code sieht wie folgt aus:
Beachten Sie, dass ich nicht mutiert der Staat hier, ich bin lediglich die Neuzuweisung der Referenz einer lokalen variable namens
state
vor der übergabe an eine andere Funktion. Mutiert ein state-Objekt wäre ein Verstoß gegen die Redux-Prinzipien.Falls Sie mit redux-persist, müssen Sie möglicherweise auch zu reinigen Ihre Lagerung. Redux-persist speichert eine Kopie Ihres Staates in einer storage-engine, und die staatlichen Kopie wird geladen und von dort auf aktualisieren.
Erste, Sie brauchen, um zu importieren die entsprechenden Lagerung Motor und dann, zu analysieren, den Zustand vor der Einstellung
undefined
und reinigen Sie die einzelnen storage state key.case 'CLEAR_DATA': return initialState
das würde funktionieren, werden aber nicht vom Staat für jeden reducer.
Hier ist eine version, wo Sie dynamisch kombinieren Sie die Reduzierstücke im Falle der Verwendung von asynchronen Reduzierstücke:
export const createRootReducer = asyncReducers => { const appReducer = combineReducers({ myReducer ...asyncReducers }); return (state, action) => { if (action.type === 'LOGOUT_USER') { state = undefined; } return appReducer(state, action); } };
if (action.type === 'RESET') return action.stateFromLocalStorage
Ist dieser Ansatz ganz klar der Staat und alle seine Geschichte? Ich denke, aus Sicht der Sicherheit: Wenn dieses implementiert wurde, sobald die
USER_LOGOUT
Aktion ausgelöst wurde, ist es möglich, um Daten von früher? (z.B. via devtools)InformationsquelleAutor Dan Abramov
Möchte ich darauf hinweisen, dass die anerkannten Kommentar von Dan Abramov ist richtig, außer wir hatten ein seltsames Problem bei der Verwendung des reagieren-router-redux-Paket zusammen mit diesem Ansatz. Unser fix war nicht eingestellten Zustand zu
undefined
sondern immer noch den aktuellen routing-reducer. Also ich würde vorschlagen, die Umsetzung der Lösung unten, wenn Sie dieses PaketIch denke, ich erlebe diese Probleme, auf die Sie sich beziehen, gerade jetzt, (wo auf logout, wird es die Niederlage auf den richtigen Weg, aber eine komplett andere Komponente laden würde), das ich umgesetzt habe, etwas ähnliches zu verkaufen, um es zu beheben, aber ich denke, etwas mit immutable js ist massing. Ich landete ein Elternteil reducer, RESET-STATE-Aktion, und ich Erben aus, die Reduzierer zu vermeiden, berühren routing insgesamt
Erlebte ähnliche Probleme, das hat es behoben. Danke.
Beachten Sie, dass mit reagieren-redux-router, die Eigenschaft ist
router
und NICHTrounting
es hängt davon ab, was man es definiert, wie in Ihrem
combineReducers()
..... wenn Sie hattecombineReducers({routing: routingReducer})
wäre es, wie in der Antwort beschriebenInformationsquelleAutor Ryan Irilli
Definieren Sie eine Aktion:
Dann in jedem deiner Reduzier-vorausgesetzt, Sie verwenden
switch
oderif-else
für das handling von mehrere Aktionen durch die einzelnen reducer. Ich werde der Fall für einenswitch
.Diese Weise, wenn Sie anrufen
RESET
Aktion, Sie reducer wird, aktualisieren Sie den Speicher mit default-Zustand.Nun, die Abmeldung können Sie handhaben das wie folgt:
Jedes mal, wenn ein userlogs, ohne einen browser refresh. Store wird immer am Standard.
store.dispatch(RESET_ACTION)
nur erläutert die Idee. Sie werden wahrscheinlich haben eine Aktion creator für den Zweck. Ein viel besserer Weg sein wird, dass Sie eineLOGOUT_ACTION
.Sobald Sie Versand dieser
LOGOUT_ACTION
. Eine benutzerdefinierte middleware kann dann abfangen dieser Aktion, entweder mit Redux-Saga oder Redux-Thunk. Beide Möglichkeiten, Sie können jedoch den Versand einer anderen Aktion 'RESET'. Auf diese Weise speichern und Abmelden reset passieren wird, synchron-und Ihr Geschäft wird bereit für einen anderen Benutzer anmelden.undefined
wie in der anderen Antwort. wenn die Anwendung erwartet eine state-Baum, und Sie geben esundefined
statt, es gibt einfach mehr bugs und Kopfschmerzen zu behandeln als nur mit einem leeren Baum.Der Staat wird nicht wirklich undefiniert, weil Reduzierstücke zurück initialState, wenn Sie auf einen nicht definierten Zustand
denke, dass mit diesem Ansatz, jede Zeit, jeder erstellen eine neue reducer man wird daran denken müssen, fügen Sie die reset-Fall.
ich habe auf jeden Fall meine Meinung geändert, denn sowohl die Gründe, plus die Idee, dass ein RESET_ACTION ist ein Aktion. so ist es nicht wirklich gehört, in dem reducer, um mit zu beginnen.
Dies ist definitiv der richtige Ansatz. Einstellung der Staat nichts, aber der Ursprüngliche Zustand ist nur ärger bringen
InformationsquelleAutor nirbhaygp
Können Sie auch eine Aktion auslösen, die behandelt wird, indem alle oder einige Reduzierungen, die Sie zurücksetzen möchten, um die erste zu speichern. Eine Aktion ausgelöst werden kann, einen reset auf Ihrem ganzen Staat, oder nur ein Stück, es scheint zu Ihnen passen. Ich glaube, das ist die einfachste und die meisten steuerbare Art und Weise, dies zu tun.
InformationsquelleAutor Daniel petrov
Mit Redux, wenn auf die folgende Lösung, die meint ich habe ein initialState in alle meine Reduzierstücke (z.B. { user: { name, E-Mail }}). In vielen Komponenten überprüfe ich auf diese verschachtelte Eigenschaften, so dass mit diesem Update ich verhindern, dass mein rendert Methoden sind gebrochen, gepaart Eigenschaft Bedingungen (z.B. wenn die Staatliche.Benutzer.E-Mail, die einen Fehler auslösen, Benutzer nicht definiert ist, wenn die oben genannten Lösungen).
InformationsquelleAutor Rob Moorman
Nur eine vereinfachte Antwort auf die beste Antwort:
InformationsquelleAutor Matt Carlotta
Kombination der Ansätze von Dan, Ryan und Rob, berücksichtigen, halten die
router
Staat und initialisieren alles andere in den Zustand Baum, landete ich mit diesem:InformationsquelleAutor Andy_D
UPDATE NGRX4
Wenn Sie eine Migration zu NGRX 4, Sie vielleicht bemerkt haben, aus der migration guide, dass die rootreducer Methode für die Kombination von Reduzierer wurde ersetzt mit ActionReducerMap Methode. Auf den ersten, diese neue Art, die Dinge machen könnte, zurücksetzen Staat eine Herausforderung. Es ist eigentlich straight-forward, aber die Art und Weise, dies zu tun, hat sich geändert.
Diese Lösung ist inspiriert von der meta-Reduzier-API-Abschnitt der NGRX4 Github docs.
Ersten, können sagen, Sie sind die Kombination von Reduzierer, wie dies mit NGRX neue ActionReducerMap option:
Nun, angenommen Sie wollen reset-Zustand aus innerhalb der app.Modul
`
`
Und das ist im Grunde ein Weg, das zu erreichen den gleichen Effekt mit NGRX 4.
InformationsquelleAutor Tyler Brown
Ich habe eine Komponente zu geben, wieder einmal die Möglichkeit den Status zurückzusetzen, müssen Sie nur diese Komponente zu verwenden, um verbessern Sie Ihren Shop und Versand einer bestimmten Aktion.geben Sie auf reset auslösen. Der Gedanke der Umsetzung ist die gleiche wie das, was @Dan sagte Abramov.
Github: https://github.com/wwayne/redux-reset
InformationsquelleAutor wwayne
Ich erstellt habe, Aktionen zu klaren Zustand. Also wenn ich Versand ein logout-action-Schöpfer-ich, Versand-Aktionen zu klaren Zustand als gut.
Benutzer-Datensatz Aktion
Logout action Schöpfer
Reducer
Ich bin nicht sicher, ob dies optimal ist?
InformationsquelleAutor Navinesh Chand
Akzeptierte Antwort half mir lösen meine Fall. Jedoch, ich traf Fall, in dem nicht-die-ganze-Zustand geräumt werden mussten. So habe ich es auf diese Weise:
Hoffe, dies hilft jemand anderes 🙂
InformationsquelleAutor pesho hristov
Nur eine Erweiterung zu @dan-abramov Antwort, manchmal können wir beibehalten müssen bestimmte Schlüssel-reset.
InformationsquelleAutor gsaandy
Wenn Sie redux-Aktionen, hier ist eine schnelle Abhilfe mit einem HOF(Höherer Ordnung Funktion) für
handleActions
.Und verwenden Sie dann
handleActionsEx
statt der ursprünglichenhandleActions
zu handhaben getrieben.Dan ' s Antwort gibt eine gute Idee über dieses problem, aber es hat nicht funktioniert gut für mich, denn ich bin mit
redux-persist
.Wenn Sie mit
redux-persist
einfach vorbeiundefined
Zustand nicht auslösen anhaltende Verhalten, so dass ich wusste, ich musste manuell entfernen Element aus dem Speicher (Reagieren Nativen in meinem Fall, alsoAsyncStorage
).oder
funktionierte nicht für mich entweder, Sie nur mich angebrüllt. (z.B. beklagen, wie "Unerwartete Schlüssel _persist ...")
Dann habe ich plötzlich nachgedacht, alles was ich will ist einfach, machen jedes einzelne reducer Rückkehr Ihrer eigenen ursprünglichen Zustand, wenn
RESET
action-Typ aufgetreten ist. So, anhaltende behandelt wird, natürlich. Offensichtlich ohne über utility-Funktion (handleActionsEx
), mein code wird nicht TROCKEN (obwohl es nur ein Einzeiler, alsoRESET: () => initialState
), aber ich konnte es nicht ertragen 'cuz ich Liebe metaprogramming.InformationsquelleAutor elquimista
Folgende Lösung für mich gearbeitet.
Fügte ich den Status zurückzusetzen Funktion meta-Reduktionen.Der key wurde für die Verwendung
alle Reduzierstücke in den ursprünglichen Zustand. Rückkehr
undefined
stattdessen wurde der Fehler verursacht, aufgrund der Tatsache, dass die Struktur des Ladens zerstört worden./Reduzierstücke/index.ts
app.- Modul.ts
InformationsquelleAutor Pan Piotr
Eine schnelle und einfache option, die für mich gearbeitet wurde mit redux-reset . Das war einfach und hat auch einige erweiterte Optionen, die für größere Anwendungen.
Setup erstellen, speichern
Versand, Ihrem "reset" in Ihrem logout-Funktion
Hoffe, das hilft
InformationsquelleAutor Munei Nengwenani
Dieser Ansatz ist sehr richtig: Zerstören alle spezifischen Status für "NAME" zu ignorieren und damit andere.
USER_LOGOUT
in das Reduzierstück und Griff ihn dort an.InformationsquelleAutor khalil zaidoun
warum verwenden Sie nicht nur
return module.exports.default()
😉Hinweis: stellen Sie sicher, dass Sie die Aktion default-Wert
{}
und Sie sind ok, weil Sie nicht wollen, um Fehler beim überprüfenaction.type
innerhalb der switch-Anweisung.InformationsquelleAutor Fareed Alnamrouti
Aus Sicht der Sicherheit, ist die sicherste Sache zu tun, wenn bei der Anmeldung eines Benutzers, ist ein Neustart alle persistenten Zustand (e.x. cookies
localStorage
,IndexedDB
,Web SQL
etc) und machen Sie einen hard refresh der Seite Verwendung vonwindow.location.reload()
. Es ist möglich, eine schlampige Entwickler versehentlich oder absichtlich gespeichert einige sensible Daten aufwindow
im DOM, etc. Weht entfernt alle persistenten Zustand und aktualisieren der browser ist der einzige Weg, um zu garantieren, dass keine Informationen aus der vorherigen Nutzer zugespielt wird, um den nächsten Benutzer.(Natürlich als Benutzer auf einem gemeinsam genutzten computer, die Sie verwenden sollten "private browsing" - Modus, schließen Sie das browser-Fenster selbst haben, verwenden Sie die "clear browsing data" - Funktion, etc, aber als Entwickler können wir nicht erwarten, dass jeder immer sein, dass eine sorgfältige)
InformationsquelleAutor tlrobinson
Fand ich, dass die akzeptierte Antwort, die gut für mich gearbeitet, aber es war der Auslöser für die ESLint
no-param-reassign
Fehler - https://eslint.org/docs/rules/no-param-reassignHier ist, wie ich behandelt Sie stattdessen, indem Sie eine Kopie erstellen, der Staat (das heißt in meinem Verständnis, die Reduxy was zu tun...):
Aber vielleicht eine Kopie in den Zustand zu übergeben Sie es in einem anderen reducer-Funktion erstellt eine Kopie, die ein wenig über-kompliziert? Diese Lesen nicht so schön, aber ist mehr auf den Punkt:
InformationsquelleAutor skwidbreth
Mein workaround bei der Arbeit mit Typoskript, erstellt von Dan ' s Antwort (redux-Testungen machen es unmöglich zu passieren
undefined
zu Druckminderer als erstes argument, also ich cache initial-root-Zustand in eine Konstante):InformationsquelleAutor Jacka
Neben Dan Abramov Antwort, sollten wir nicht explizit festlegen, Aktion, action = {type: '@@INIT'} neben Staat = undefined. Mit den oben genannten Maßnahmen geben, die jeder reducer gibt den ursprünglichen Zustand.
InformationsquelleAutor rupav jain
in server, ich habe eine variable ist: global.isSsr = true
und in jeder reducer, ich habe ein const ist : initialState
Zum zurücksetzen der Daten im Speicher, ich habe das folgende mit jeder Reducer:
Beispiel mit appReducer.js:
endlich auf den server-router:
InformationsquelleAutor Ngannv
Folgende Lösung funktioniert bei mir.
Zuerst auf initiation unserer Anwendung die Druckminderer Staat ist frische und neue mit Standard - InitialState.
Haben wir eine Aktion hinzufügen, dass Anrufe auf die APP inital load, um weiterhin default-Zustand.
Beim Abmelden von der Anwendung können wir einfach zuweisen die default-Zustand und reducer funktioniert genau wie neue.
Wichtigsten APP-Container
Haupt-APP Reducer
Auf Logout Aufruf-Aktion für den Status zurückzusetzen
Hoffe, das löst Ihr problem!
InformationsquelleAutor Mukundhan
Für mich zurücksetzen der Staat in seinen ursprünglichen Zustand, schrieb ich den folgenden code:
InformationsquelleAutor JDev
Mein nehmen zu halten Redux aus der Bezugnahme auf die gleiche variable der Ausgangszustand:
InformationsquelleAutor Hani
Andere Möglichkeit ist:
'@@redux/INIT'
ist der action-Typ, der redux löst sich automatisch, wenn SiecreateStore
, also vorausgesetzt, Ihr Reduzierstücke alle haben den Standard bereits, dies würde verfangen, indem Sie diese und starten Sie Ihren Status aus frisch. Es könnte als ein privates Implementierungsdetail von redux, obwohl, so dass Käufer Vorsicht...InformationsquelleAutor lobati
Einfach Abmelden-link deaktivieren Sitzung und aktualisieren Sie die Seite. Kein zusätzlicher code benötigt für Ihr Geschäft. Jedes mal, wenn Sie wollen, vollständig zurücksetzen des Status eine Aktualisierung der Seite ist eine einfache und leicht wiederholbare Art und Weise, es zu handhaben.
Ich weiß wirklich nicht verstehen, warum die Menschen downvote Antworten wie diese.
Warum haben Menschen downvoted? Wenn Sie eine neue redux Zustand, mit leeren Inhalten, die Sie im Grunde immer noch die früheren Zustände in der Erinnerung, und könnte Sie theoretisch auf die Daten zugreifen. Aktualisierung der browser IST Ihre sicherste Wette!
InformationsquelleAutor user3500325