2016-04-22 10 views
6

Ich habe das Argument für die Trennung von Aktionen und Reduzierungen gesehen, weil sie eine Viele-zu-Viele-Beziehung haben.Warum Aktionen + Reduzierungen in Redux trennen?

Ich glaube nicht, dass das tatsächlich in Redux gilt. Da nur 1 Datenspeicher vorhanden ist, sollten Aktionen für Reduzierungen 1: n-Werte sein.

In der Regel werden Reduzierungen auf eine bestimmte Änderung für einen bestimmten Datenspeicher angewendet.

MY_ACTION = "MY_ACTION" 
function reducer(state, action) { 
    switch(action.type) { 
     case MY_ACTION: // stuff with my action to create new state 
     default: return state 
    } 
} 

Wir können mehrere Minderer mit combineReducers kombinieren also warum der Handler selbst für eine Aktion mit der Aktion nicht definieren.

Zum Beispiel

class Action { 
    constructor(type) { 
     this.type = type 
     this.handlers = [] 
    } 
    add_handler(handler) { 
     this.handlers += handler 
    } 
    get_reducer() { 
     reducer = combineReducers(this.handlers) 
     return (state, action) => { 
      if(action.type == this.type) { 
       return reducer(state, action) 
      } 
      return state 
     } 
    } 
} 

Mit dem „Enten“ -Muster, am Ende wir die wichtigsten Reduzierungen im selben Modul wie die Aktion Erklärung setzen.

Gibt es einen Grund, Reduzierungen + Aktionen getrennt von Redux zu halten?

+0

Ich kann nicht sagen, was Sie fragen oder illustrieren. – JMM

Antwort

3

Der Hauptgrund für die Trennung der Aktionsersteller von der Reducer-Funktion ist, dass die Reducer-Funktion eine reine Funktion sein muss. Wenn Sie etwas in einem Aktionsersteller tun möchten, beispielsweise einen asynchronen API-Aufruf, dann könnten Sie dies nicht in den Reduzierer einfügen. Es gibt eine großartige Erklärung zu diesem here.

+0

Ich kann hinzufügen, dass Sie nicht möchten, dass Ihre Untersetzer auf Ajax-Aufrufe zugreifen, Dienste/Funktionen mit Nebeneffekten .. aus dem gleichen Grund (sie sollten rein sein). Die Action-Ersteller können auf Services zugreifen und Nebenwirkungen erstellen, ganz wie sie wollen. Vielleicht macht es Ihre Anwendungsstruktur zu spaghettiartig, wenn Sie Actions-Ersteller und Reducer an derselben Stelle platzieren. Konkret ist meine Angular2-Anwendung in Module strukturiert, und ich möchte nicht, dass mein Ladenmodul auf irgendwelche Dienste usw. zugreifen kann. Auf der anderen Seite müssen die Ersteller von Aktionen auf alle Arten von Diensten zugreifen, so sie brauchen Zugang zu mehr ... – Spock

Verwandte Themen