2016-07-23 2 views
9

Ich frage mich, manchmal habe ich einen Reducer, der Informationen von einem anderen Reducer benötigt. Zum Beispiel habe ich diesen Minderer:Redux: Aufruf store.getState() in einer Reducer-Funktion, ist das ein Anti-Muster?

import * as ActionTypes from '../actions/action_type_constants'; 
import KeyCode from 'keycode.js/index'; 
import {store} from "../index"; 
import {mod} from "../pure_functions"; 

export function selectedCompletion(state = 0, action) { 
    if (action.type === ActionTypes.arrowKeyPressed) { 
    const completionsLength = store.getState().completions.data.length; 
    if (action.keyCode === KeyCode.UP) { 
     return mod(state - 1, completionsLength); 
    } else if (action.keyCode === KeyCode.DOWN) { 
     return mod(state + 1, completionsLength); 
    } 
    } 
    return state; 
} 

ich store.getState telefoniere in der zweiten Zeile der Funktion, denn sonst kann ich den Index nicht korrekt bestimmen.

Ich könnte diesen und den anderen Reducer wahrscheinlich umgestalten, so dass es ein großer Reducer wird, aber aus Gründen der Lesbarkeit würde ich diese Option bevorzugen.

Ich bin mir nicht sicher, ob ich irgendwie Probleme bekommen würde, wenn ich dieses Muster des Aufrufs store.getState() in einem Reducer verwenden würde.

Antwort

12

Ja, das ist absolut ein Anti-Pattern. Reducer-Funktionen sollten "rein" sein und nur basierend auf ihren direkten Eingaben (dem aktuellen Zustand und der Aktion).

Die Redux-FAQ behandelt diese Art von Problem bei http://redux.js.org/docs/FAQ.html#reducers-share-state. Grundsätzlich sollten Sie entweder eine benutzerdefinierte Reducer-Logik schreiben, die die benötigten zusätzlichen Informationen weitergibt, oder weitere Informationen in Ihre Aktion einfügen.

Ich schrieb auch einen Abschnitt für die Redux-Dokumentation Structuring Reducers, die eine Reihe wichtiger Konzepte in Bezug auf Reducer-Logik diskutiert. Ich würde Sie ermutigen, das durchzulesen.

+0

Ich bin ein wenig verwirrt hier, wie ist eine getState Aufruf eine Verletzung der auf dem aktuellen Stand zu sein? Vor allem angesichts des Anwendungsfalles eines 3rd Party Reducers, den Sie nicht neu anordnen können. –

+1

Erstens ist die Definition einer "reinen Funktion" "eine Funktion, die nur auf ihre Eingaben angewiesen ist und nichts außerhalb ihrer selbst verändert oder beeinflusst". Wenn Sie auf einen importierten Store verweisen, ist er nicht rein. Zweitens koppelt dies den Reducer mit dieser spezifischen Store-Instanz, was bedeutet, dass es in Fällen wie Testen oder mehreren Speichern nicht funktioniert. Also, der Code _may_ funktioniert in den meisten Fällen, aber es ist definitiv nicht "korrekt". Bitte lies diesen FAQ-Eintrag und [Strukturierungsreduzierer] (http://redux.js.org/docs/recipes/StructuringReducers.html) erneut, um zu erfahren, wie man mit Dingen umgeht. – markerikson

Verwandte Themen