2015-11-08 11 views
20

Ich benutze combinerReducers, um alle Reduzierer zu kombinieren, um den Speicher zu erstellen, bedeutet das, dass jede Aktion, die von einer beliebigen Ansicht ausgelöst wird, alle Reduzierungen auslöst, die aufgerufen werden, um den Aktionstyp zu überprüfen?Alle Reduzierungen werden aufgerufen, wenn eine Aktion ausgelöst wird?

Oder verstehe ich nicht vollständig das redux Konstruktionsprinzip?

Antwort

11

Ja, das ist richtig.

jedoch eine Option, um dieses Verhalten zu optimieren (von dem Redux docs vorgeschlagen) zu verwenden ist ‚neu wählen‘ https://github.com/rackt/reselect

Reselect im Grunde können Ihnen memoized Selektoren erzeugen, wobei man sagen kann, dass Requisiten A auf Zustand abhängt B und Zustand C und berechnen daher nur Requisiten A neu, wenn sich der Zustand B oder der Zustand C ändert.

Beachten Sie, dass dadurch immer noch alle Reduzierungen ausgelöst werden (und die switch-Anweisung durchlaufen wird, um zu sehen, ob die Aktion auf sie angewendet werden kann). Ich glaube, dass dieses Verhalten nicht umgangen werden kann. Wenn Sie jedoch erneut auswählen, bedeutet dies, dass Ihre Top-Level-Komponente nur dann eine Prop/Status-Änderung erhält, wenn eine tatsächliche Änderung diesen Status beeinflusst, anstatt jedes Mal eine Änderung auszulösen und React alles erneut rendern zu lassen, selbst wenn die Änderung keine Auswirkungen hatte weil es irgendwo nicht verwandt war. (Die Readme in der Neuauswahl erklärt besser)

+0

Eigentlich verwende ich vue.js mit Redux, danke für Ihren Vorschlag trotzdem. – elaijuh

+4

Sie sind willkommen :) aber egal, obwohl alle Reducer aufgerufen werden, was wirklich passiert ist, dass die Switch-Anweisungen überprüft werden, und nur der Reducer, der diese Aktion handhabt, wird einige Arbeit tun, alle anderen tun nichts, also wirklich ist kein Leistungsproblem. Es ist erwähnenswert, dass moderne JS große Switch-Anweisungen in eine Jump-Tabelle mit O (1) Zugriffszeit optimieren, so dass Sie keine großen Switch-Anweisungen in Reducern auswerten müssen, selbst wenn die Aktion oft nicht übereinstimmt irgendwelche Bedingungen. – luanped

+0

Ein Action-Beobachter-Muster in Reducer hätte besser, anstatt es durch Schalter zu tun, es ist ein perfektes Beispiel für Beobachter Muster –

3

Ja - alle Reduzierungen werden aufgerufen, wenn Sie die Aktion versenden. Sie werden einen netten Nebeneffekt dazu bekommen. Da jeder Reduzierer den Standardzustand zurückgibt, wenn die Aktion nicht gefunden wird, erhalten Sie Ihren Anfangszustand mit einer einzigen Aktion.

Es könnte von Vorteil sein, obwohl ich es noch nicht versucht habe, eine einzige Aktion zu haben, die mehrere Reduzierungen betrifft, die den Zustand in zwei verschiedenen Teilen des Ladens ändern.

Wenn Sie erneut hinzufügen, wie @Luanped vorgeschlagen, können Sie viele kranke Ergebnisse erhalten!

Mein aktueller Stack ist:

  • Redux für Staat, Aktionen Management
  • Reselect für die Datentransformationsschicht
  • für Ansichten Reagieren

zum Arbeitsablauf Hinzufügen erneut auswählen und es macht zusammen mit Reduzierern zu arbeiten war das Beste, was mir letzte Woche passiert ist.

+0

'viele kranke Ergebnisse' klingt gegenüber 'beste Sache, die mir passiert ist, so schlagen Sie vor zu verwenden 'erneut auswählen '? – elaijuh

+0

heheh krank wie böse oder verdreht === gut, aber unerwartet .... und ja wiederwählen ist eine sehr leistungsfähige Ergänzung zum Arbeitsablauf.In dem Moment, in dem Sie feststellen, dass Ihr Selektor bestimmte Funktionen zurückgeben kann, die von Ihrem Zustand abhängen, sind Sie zu Hause :) – Kocur4d

+0

@ Kocur4d Was meinen Sie? 'Jeder Reduzierer gibt den Standardzustand zurück, wenn die Aktion nicht gefunden wird Einzelaktion? – Reza

Verwandte Themen