Ich wollte nur einige pragmatische Unterschiede zu dem von Redux inspirierten RxJS-Code hinzufügen.
Ich habe jeden Aktionstyp einer Subject-Instanz zugeordnet. Jede zustandsbehaftete Komponente verfügt über ein Betreff, das dann einer Reduzierungsfunktion zugeordnet wird. Alle Reduzierungsströme werden mit dem Status kombiniert merge
und geben ihn dann aus scan
. Der Standardwert wird mit startWith
kurz vor dem festgelegt scan
. Ich habe publishReplay(1)
für Staaten verwendet, könnte es aber später entfernen.
Die Funktion "Reale Pure Rendering" besteht darin, nur dort zu platzieren, wo Sie Ereignisdaten erzeugen, indem Sie alle Produzenten / Subjekte einsenden.
Wenn Sie untergeordnete Komponenten haben, müssen Sie beschreiben, wie diese Zustände in Ihren kombiniert werden. combineLatest
könnte ein guter Ausgangspunkt dafür sein.
Bemerkenswerte Unterschiede in der Implementierung:
Keine Middleware, nur RXJS-Operatoren. Ich denke, das ist die größte Kraft und Schwäche. Sie können immer noch Konzepte ausleihen, aber es fällt mir schwer, Hilfe von Schwestergemeinschaften wie redux und cycle.js zu erhalten, da dies eine weitere benutzerdefinierte Lösung ist. Deshalb muss ich in diesem Text "Ich" anstelle von "Wir" schreiben.
Kein Schalter / Fall oder Zeichenfolgen für Aktionstypen. Sie haben eine dynamischere Möglichkeit, Aktionen zu trennen.
rxjs kann an anderer Stelle als Tool verwendet werden und ist nicht in der Statusverwaltung enthalten.
Weniger Produzenten als Aktionstypen (?). Ich bin mir nicht sicher, aber Sie können viele Reaktionen in übergeordneten Komponenten haben, die untergeordnete Komponenten abhören. Das bedeutet weniger imperativen Code und weniger Komplexität.
Sie besitzen die Lösung. Kein Rahmen erforderlich. Gut und schlecht. Sie werden sowieso Ihr eigenes Framework schreiben.
Es ist viel fraktaler und Sie können Änderungen aus einem Unterbaum oder mehreren Teilen des App-Statusbaums problemlos abonnieren.
- Ratet mal, wie einfach es ist, Epen wie Redux-Observavble zu machen? Wirklich einfach.
Ich arbeite auch an viel größeren Vorteilen, bei denen die untergeordneten Komponenten als Streams beschrieben werden. Dies bedeutet, dass wir den übergeordneten und untergeordneten Status in den Reduzierungen nicht erfassen müssen, da wir die Zustände basierend auf der Komponentenstruktur nur ("nur") rekursiv kombinieren können.
Ich denke auch darüber nach, React zu überspringen und mit Snabbdom oder etwas anderem zu arbeiten, bis React besser mit reaktiven Zuständen umgeht. Warum sollten wir unseren Staat nach oben aufbauen, um ihn wieder über Requisiten zu zerlegen? Also werde ich versuchen, mit Snabbdom eine Version 2 dieses Musters zu erstellen.
Hier ist ein erweitertes, aber kleines Snippet, in dem die Datei state.ts den Statusstrom erstellt. Dies ist der Status der Ajax-Form-Komponente, der ein Objekt aus Feldern (Eingaben) mit Validierungsregeln und CSS-Stilen erhält. In dieser Datei verwenden wir nur die Feldnamen (Objektschlüssel), um alle untergeordneten Status in den Formularstatus zu kombinieren.
export default function create({
Observable,
ajaxInputs
}) {
const fieldStreams = Object.keys(ajaxInputs)
.map(function onMap(fieldName) {
return ajaxInputs[fieldName].state.stream
.map(function onMap(stateData) {
return {stateData, fieldName}
})
})
const stateStream = Observable.combineLatest(...fieldStreams)
.map(function onMap(fieldStreamDataArray) {
return fieldStreamDataArray.reduce(function onReduce(acc, fieldStreamData) {
acc[fieldStreamData.fieldName] = fieldStreamData.stateData
return acc
}, {})
})
return {
stream: stateStream
}
}
Obwohl der Code für sich genommen möglicherweise nicht viel aussagt, zeigt er, wie Sie den Status nach oben aufbauen und wie Sie problemlos dynamische Ereignisse erzeugen können. Der zu zahlende Preis ist, dass Sie einen anderen Codestil verstehen müssen. Und ich liebe es, diesen Preis zu zahlen.