Dies ist ein Teil der offiziellen Redux-Dokumentation :
Es wird als Reduzierer bezeichnet, da dies die Art von Funktion ist, an die Sie übergeben würden
Array.prototype.reduce(reducer, ?initialValue)
Es macht für mich nicht viel Sinn. Könnte mir jemand erklären, warum sie eigentlich Reduzierer genannt werden? Die Tatsache, dass sie einen Standardwert zurückgeben (oder einen Standardargumentwert haben), macht sie meiner Meinung nach nicht zu Reduzierern.
javascript
redux
Anton Savchenko
quelle
quelle
reduce
, die Zugriff auf den Standardwert und einen anderen Wert hat und Ihnen Ihren potenziell transformierten Standardwert zurückgibt.state -> action -> state
Antworten:
Reduzierstücke nicht nur Standardwerte zurück. Sie geben immer die Akkumulation des Zustands zurück (basierend auf allen vorherigen und aktuellen Aktionen).
Daher wirken sie als Minderer des Staates. Jedes Mal, wenn ein Redux-Reduzierer aufgerufen wird, wird der Status mit der Aktion übergeben
(state, action)
. Dieser Zustand wird dann basierend auf der Aktion reduziert (oder akkumuliert), und dann wird der nächste Zustand zurückgegeben. Dies ist ein Zyklus des Klassikersfold
oder derreduce
Funktion.Wie @azium mit zusammenfasste
state -> action -> state
.quelle
Wenn Sie die Reihe von Aktionen in Ihrer App als eine Liste oder eher als einen Stream betrachten, ist dies möglicherweise sinnvoller.
Nehmen Sie dieses erfundene Beispiel:
Das erste Argument ist eine Funktion des Formulars
(Int, String) => Int
. Zusammen mit einem Anfangswert übergeben Siereduce
eine sogenannte "Reduzierungsfunktion" und erhalten das Ergebnis der Verarbeitung der Artikelserie. Man könnte also sagen, dass die Reduzierungsfunktion beschreibt, was mit jedem einzelnen Element getan wird, um das Ergebnis zu ändern. Mit anderen Worten, die Reduzierungsfunktion nimmt die vorherige Ausgabe und den nächsten Wert und berechnet die nächste Ausgabe.Dies ist analog zu dem, was ein Redux-Reduzierer tut: Er nimmt den vorherigen Zustand und die aktuelle Aktion an und berechnet den nächsten Zustand.
Im echten funktionalen Programmierstil können Sie die Bedeutung der Argumente und des Ergebnisses konzeptionell löschen und sich nur auf die "Form" der Ein- und Ausgaben konzentrieren.
In der Praxis sind Redux-Reduzierer in der Regel orthogonal, da sie für eine bestimmte Aktion nicht alle Änderungen an denselben Eigenschaften vornehmen, wodurch es einfach ist, ihre Verantwortlichkeiten aufzuteilen und die Ausgabe mit zu aggregieren
combineReducers
.quelle
Wie bereits erwähnt, bezieht sich der Name auf das Konzept eines Reduzierers in der funktionalen Programmierung. Möglicherweise ist auch die Definition des Reduzierers im Merriam-Webster-Wörterbuch hilfreich:
Der Reduzierer konsolidiert Aktionen in einem einzelnen Objekt, das den Anwendungsstatus darstellt.
quelle
Wie? Um dies zu beantworten, möchte ich noch einmal einen Reduzierer definieren:
Und was macht ein Redux-Reduzierer?
Bei a
collection of actions
wird der Reduzierer auf jeden Wert der Sammlung angewendet (von links nach rechts). Beim ersten Mal wird das zurückgegebeninitial value
. Jetzt wird der Reduzierer erneut auf diesen Anfangszustand und die erste Aktion angewendet, um den nächsten Zustand zurückzugeben. Und das nächste Sammlungselement (Aktion) wird jedes Mal auf das angewendetcurrent state
, um das zu erhalten,next state
bis es das Ende des Arrays erreicht. Und dann bekommst duthe final state
. Wie cool ist das!quelle
Der Autor denkt Zustand als Akkumulator der Reduktionsfunktion. Ex:
Die Reduktionsfunktion stammt von Functional Programming, der Name "Reducer" stammt ebenfalls von FP.
Ich mag es nicht, diesen Namen hier zu verwenden. Weil ich die Welt nach Aktionen nicht als ein einziges Wertergebnis sehe. Der Zustand hier ist ein Objekt. Beispielsweise:
Diese Reducer reduziert nichts. Und es ist mir egal, ob es irgendetwas reduziert oder nicht. Es wird sinnvoller sein, es als Transducer zu bezeichnen.
quelle
Wir wissen, woher Reduzierer kommen (funktionale Programmierung) und warum sie möglicherweise weniger Arbeit leisten (reduzieren Sie n Eingabeelemente auf einen einzigen Rückgabewert - genau das tun normale Funktionen). Allerdings: Der Name ist nur ein Name, wie Rose der Name für eine Rose ist. Nicht zu viel nachdenken. Redux-Programmierer sind IT-Mitarbeiter, sie sind in ihrem Kontext eingeschlossen und dort macht es Sinn. Der Rest von uns muss das Recht des Erfinders akzeptieren, einen blauen Hund eine gelbe Katze zu nennen ;-)
quelle
Wie wäre es, wenn wir es von nun an Deducer nennen ? Es leitet den neuen Status basierend auf dem vorherigen Status und der eingehenden Aktion ab.
quelle
Sie sollten nicht als Reduzieren bezeichnet werden, da Reduzieren bedeutet, weniger zu machen. Diese Funktionen machen meistens mehr. und dann zurückgeben
quelle
Ich konnte nicht genau erkennen, wie ein Redux-Reduzierer direkt der Funktion zugeordnet ist, mit der Sie arbeiten.
reduce
Hier sind einige Beispiele, um zu sehen, wie sie übereinstimmen.Zuerst eine Standardreduzierungsfunktion (in MDN als "Akkumulator" bezeichnet) aus der MDN Array.reduce- Dokumentation und dann ein vereinfachtes Beispiel von Dan Abramov
Counter.js
am Ende seines Blogposts "Möglicherweise benötigen Sie Redux nicht" .sum
Fügt dem Akku einen Wert hinzureducer
addiert / subtrahiert einen Wert zum / vom Akkumulator.In beiden Fällen ist der 'Zustand' hier nur eine ganze Zahl.
Sie "akkumulieren" die Aktionen in den Zustand. Dies ist auch die unveränderliche Möglichkeit, ein JavaScript-Objekt zu ändern.
quelle
Andere Antworten erklären gut, warum es so heißt, aber lassen Sie uns versuchen, mehr Dinge zu benennen ...
Erstens
reduce
könnte angerufen werdenuse anOperator with every action name and accumulated state, starting with origState
. In Smalltalk heißt esactions inject: origState into: anOperator
. Aber was spritzen Sie eigentlich in den Bediener? Der ursprüngliche Status UND die Aktionsnamen. Selbst in Smalltalk sind Methodennamen nicht sehr klar.actionOperators[increment]
ist ein Reduzierer, aber ich würde ihn lieber als actionOperator bezeichnen, da er für jede Aktion implementiert ist. Der Zustand ist nur ein Argument (und ein anderes als Rückgabewert).Reducer ist jedoch ein besseres Wort, um über den Google-Suchergebnissen zu stehen. Es ist auch ähnlich wie Redux.
quelle
In diesem Code unten müssen Sie sich nur den Akkumulator als die Aktionen und currentValue als einen Status im Redux-Kontext vorstellen. In diesem Beispiel erfahren Sie, warum sie es auch als Reduzierer bezeichnen.
Die Methode redu () führt eine Reduzierungsfunktion (die Sie bereitstellen) für jedes Element des Arrays aus, was zu einem einzelnen Ausgabewert führt.
quelle