Wie Sie hinzufügen/entfernen, um ein redux-Shop generiert mit normalizr?
Suchen, die Beispiele von der README:
Angesichts der "schlechten" Struktur:
[{
id: 1,
title: 'Some Article',
author: {
id: 1,
name: 'Dan'
}
}, {
id: 2,
title: 'Other Article',
author: {
id: 1,
name: 'Dan'
}
}]
Es ist extrem einfach, um ein neues Objekt hinzuzufügen. Alles, was ich zu tun ist, so etwas wie
return {
...state,
myNewObject
}
In der reducer.
Nun angesichts der Struktur des "guten" Baum, ich habe keine Ahnung, wie sollte ich Vorgehen.
{
result: [1, 2],
entities: {
articles: {
1: {
id: 1,
title: 'Some Article',
author: 1
},
2: {
id: 2,
title: 'Other Article',
author: 1
}
},
users: {
1: {
id: 1,
name: 'Dan'
}
}
}
}
Jeden Ansatz habe ich schon gedacht, erfordert eine komplexe Objekt-manipulation, die macht mich fühle mich wie ich bin nicht auf der rechten Spur, da normalizr soll macht mein Leben einfacher.
Kann ich keine Beispiele online der jemand arbeitet mit dem normalizr Baum in dieser Art und Weise. Die offiziellen Beispiel nicht hinzufügen und entfernen so war es auch nicht helfen, entweder.
Könnte jemand lassen Sie mich wissen, wie das hinzufügen/entfernen von einer normalizr Baum der richtige Weg?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Folgende ist direkt von einem post von der redux/normalizr Schöpfer hier:
Damit Ihr Staat Aussehen würde:
Ihre Reduzierstücke Aussehen könnte
Also, was ist hier Los? Beachten Sie zunächst, dass der Zustand normalisiert. Wir haben nie Personen in anderen Einrichtungen. Sie beziehen sich auf jede andere von der IDs. Also wenn ein Objekt verändert, es gibt nur einen einzigen Ort, wo Sie aktualisiert werden muss.
Zweiten, merken, wie wir darauf reagieren CREATE_PLAN sowohl durch hinzufügen einer entsprechenden Einheit in den Plänen reducer und, indem seine ID an den currentPlans reducer. Das ist wichtig. Bei komplexeren apps, die Sie haben können Beziehungen, z.B. Pläne reducer verarbeiten kann ADD_EXERCISE_TO_PLAN in der gleichen Weise durch Anhängen einer neuen ID in das array innerhalb der plan. Aber wenn die übung selbst aktualisiert, gibt es keine Notwendigkeit für Pläne reducer zu wissen, dass, als ID hat sich nicht geändert.
Dritten, beachten Sie, dass die Entitäten Reduzierstücke (Pläne und übungen) spezielle Klauseln Ausschau nach der Aktion.Personen. Dies ist für den Fall haben wir eine server-Antwort mit "bekannte Wahrheit", die wir aktualisieren möchten alle unsere Gesellschaften zu reflektieren. Bereiten Sie Ihre Daten auf diese Weise vor dem Versand eine Aktion, die Sie verwenden können, normalizr. Sie sehen es in der "real world" - Beispiel in der Redux-repo.
Beachten Sie schließlich, wie Entitäten Reduzierstücke ähnlich sind. Möchten Sie vielleicht eine Funktion schreiben, zu generieren. Es ist aus der Umfang meiner Antwort ist—manchmal möchte man mehr Flexibilität, und manchmal möchten Sie weniger boilerplate. Sie können sich die Paginierung code in der "realen Welt" Beispiel Reduzierstücke für ein Beispiel der Erzeugung ähnlichen Reduzierungen.
Oh, und ich { ...a, b...} - syntax. Es aktiviert in Babel Phase 2 als ES7 Vorschlag. Es nennt sich "Objekt-spread-operator" und entspricht zu schreiben-Objekt.assign({}, a, b).
Als für Bibliotheken, die Sie verwenden können, Lodash (seien Sie vorsichtig, nicht zu mutieren, obwohl, z.B. merge({}, a, b} korrekt ist, aber merge(a, b) ist nicht), updeep, reagieren-addons-update oder etwas anderes. Allerdings, wenn Sie feststellen, selbst benötigen, um eine tiefgreifende updates, es wahrscheinlich bedeutet, dass Ihr Zustand Baum ist nicht flach genug, und dass Sie nicht verwenden die funktionale Komposition genug. Auch Ihr erstes Beispiel:
kann geschrieben werden als
Object.keys(plans).map()
im reagieren, statt nur über die aktuellen Pläne array.const newState = {...state}
, und danndelete newState[action.id]
und dannreturn newState
. Die Mutation ist in Ordnung, wenn Sie nicht mutiert der alte Zustand.Meisten der Zeit, die ich verwenden normalizr für Daten, die ich von einer API, denn ich habe keine Kontrolle über die (meist) tief verschachtelten Datenstrukturen. Wir unterscheiden Entities und Ergebnis und deren Verwendung.
Personen
Den reinen Daten ist in der entities-Objekt, nachdem Sie normalisiert wurden (in Ihrem Fall
articles
undusers
). Ich würde empfehlen, entweder verwenden Sie einen Druckminderer für alle Personen-oder Reduzierstück für jeden entity-Typ. Die Entität reducer(s) sollten verantwortlich sein halten Sie Ihre (server -) Daten-Synchronisation und eine einzige Quelle der Wahrheit.Ergebnis
Sind die Ergebnisse nur Hinweise auf Ihre Entitäten. Stellen Sie sich Folgendes Szenario vor: (1) Holen Sie die von einer API empfohlen
articles
mitids: ['1', '2']
. Speichern Sie die Elemente in Ihrem Artikel Einheit reducer. (2) Jetzt Holen Sie sich alle Artikel von einem bestimmten Autor mitid: 'X'
. Wieder synchronisiert die Artikel der Artikel Einheit reducer. Die Artikel Einheit reducer ist die einzige Quelle der Wahrheit für alle Ihre Artikel-Daten - thats it. Jetzt wollen Sie noch einen anderen Ort, um zu unterscheiden die Artikel ((1) empfohlene Artikel und (2) Artikel von Autor X). Sie können einfach halten Sie diese in einem anderen use-case-spezifischen reducer. Der Zustand, dass reducer könnte wie folgt Aussehen:Jetzt, Sie kann leicht sehen, dass der Artikel von Autor X ist eine empfohlene Artikel als gut. Aber Sie halten nur eine einzige Quelle der Wahrheit in Ihrem Artikel entity-reducer.
In der Komponente können Sie ganz einfach zuordnen von Entitäten + empfohlen /articlesByAuthor präsentieren das Unternehmen.
Disclaimer: ich kann empfehlen, einen blog-post schrieb ich, die zeigt, wie ein real-Welt-app nutzt normalizr um zu verhindern, dass Probleme in der staatlichen Verwaltung: Redux Normalizr: Verbessern Sie Ihr State-Management
Habe ich umgesetzt, eine kleine Abweichung von Generika reducer werden kann über das internet gefunden. Es ist in der Lage löschen von Elementen aus dem cache. Alles, was Sie tun müssen ist, stellen Sie sicher, dass auf jedem löschen Sie senden eine Aktion mit Feld gelöscht:
Beispiel zur Verwendung in Aktion-code:
In Ihrem reducer, behalten Sie eine Kopie des un-normalisierten Daten. Auf diese Weise können Sie etwas wie das hier tun (beim hinzufügen eines neuen Objekts in ein array im Stand):
Wenn Sie nicht wollen, zu halten, un-normalisierten Daten in Ihrem Shop, können Sie auch denormalize