2016-05-22 7 views
2

In diesem github redux example wird ein Dispatch des Ereignisses ADD_TODO verwendet, um eine Aufgabe hinzuzufügen. Während des Debugging habe ich herausgefunden, dass das Hinzufügen einer Aufgabe sowohl die reducersTodos und Sichtbarkeitsfilter aufgerufen wird.Warum ein Versand zu einem Reduzierer bewirkt, dass alle Minderer aufgerufen werden?

Wie kann ich nenne nur die todos Minderer und nicht visibilityFilter Minderer, wenn ich eine Aufgabe hinzufügen. Auch der visibilityFilter Reducer, wenn ich ein Ereignis vom Typ SET_VISIBILITY_FILTER gesendet habe.

+1

Ich habe nur das Repo geklont und nichts verändert. Ich habe eine console.log für 'SET_VISIBILITY_FILTER' Aktion und' ADD_TODO' hinzugefügt. Wenn ich eine Aufgabe hinzufüge, protokolliert es nichts von 'SET_VISIBILITY_FILTER' Reduzierer –

+0

Ich habe das Konsolenprotokoll nicht verwendet, sondern direkt in Google Chrome Debugger debuggt. Sie können reproduzieren, indem Sie (1) Breakpoints in beide Reduzierungen setzen, bevor die switch-Anweisung (2) auf die Benutzeroberfläche im Browser gehen (http: // locahost: 3000, wenn Sie den Befehl npm start ausführen) und eine Aufgabe hinzufügen 'Testaufgabe' im Bearbeitungsfeld. Sie werden sehen, dass beide Reduzierungen Pausen bekommen, aber nur die Aktion im Todos Reducer ausgeführt wird. –

+0

Ist das nicht, weil 'combineReducers()' die Reduzierungen analysiert und sie nicht wirklich ausführt? –

Antwort

2

Das Dienstprogramm combineReducers ruft absichtlich alle angeschlossenen Reduzierfunktionen für jede Aktion auf und gibt ihnen die Möglichkeit zu reagieren. Dies liegt daran, dass die vorgeschlagene Redux-Reducer-Struktur eine "Reducer-Zusammensetzung" ist, bei der viele weitgehend unabhängige Reducer-Funktionen zu einer Struktur kombiniert werden können und viele Reducer-Funktionen möglicherweise auf eine einzelne Aktion reagieren und ihre eigene Zustandsschicht aktualisieren können.

+0

Mein Anliegen ist die Methode [MapStateToProps] (https://github.com/reactjs/redux/blob/master/examples/todos/containers/VisibleTodoList.js), die für alle Container-Komponenten aufgerufen wird. In meinem Fall habe ich 5 Container-Komponenten. Wenn eine Aktion ausgelöst wird, sollte sie nur einen Container und keine der untergeordneten oder untergeordneten Komponenten aktualisieren. Ich sehe, dass die Funktion ** MapStateToProps ** für alle 5 Container aufgerufen wird und die Ressourcen verschwendet. Gibt es eine Möglichkeit, dass ich verhindern kann, dass ** MapStateToProps ** ausgeführt wird? –

+2

Nein. Sie missverstehen die Absicht hinter "mapStateToProps", und wie die React-Redux 'connect()' -Funktion es verwendet. Da es in Redux einen einzelnen Statusbaum gibt, hat jede ausgeführte Aktion _could_ jeden Teil des Status aktualisiert, und es gibt nur eine Abonnementbenachrichtigung. Also, 'connect()' führt _alle_ abonnierten MSTP-Funktionen erneut aus, vergleicht dann aber die Ergebnisse für jeden einzelnen, um zu sehen, ob sich etwas vom letzten Aufruf geändert hat. Wenn die Ausgabe für ein MSTP identisch ist, wird die Komponente nicht erneut gerendert. Sie möchten _MSTP jedes Mal erneut ausführen. – markerikson

+1

Ich verwende nicht [Erneut auswählen] (https://github.com/reactjs/reselect). Trotzdem, was du beschrieben hast, würde funktionieren? Das sehe ich nicht in meinem Code. Es gibt keine Logik, die das Ausführen der MSTP-Funktionen verhindert. –

Verwandte Themen