2016-11-06 1 views
0

Ich habe ein Reduktionsmittel, die für die Anzeige des nächsten und vorherigen Element die aktuell sichtbaren Element aus einer Liste von einer Art, mit einem Fall hält:zulassen Minderer Zugang zu Staat haben

export function currentIndex(state = null, action) { 
    switch (action.type) { 
    case types.INCREMENT: 
     return state + 1 
    case types.DECREMENT: 
     return state - 1; 
    } 
} 

Ich habe auch eine random Zustand, der anfänglich falsch ist, aber wenn er auf "Wahr" gesetzt ist, möchte ich, dass der currentListItem Reduzierer in der Lage ist, dies zu berücksichtigen und stattdessen eine Zufallszahl auszugeben.

Welches ist die idiomatische Methode, dies bei Redux zu tun?

+0

Huh? Das ist kein Tutorial-Code. Auch warum wäre es irrelevant wenn es ?? Ein einzelner Reducer ist keine Option, da next und previous über die nächsten und vorherigen HTML-Buttons versandt werden und random eine umschaltbare Schaltfläche ist. Wenn Sie also bei der nächsten Taste umschalten, wird ein zufälliger Gegenstand erzeugt. –

+0

Nun, es sieht aus wie ein Tutorial-Code (jeder inkrementiert Zahlen in ihrer Tutorial-Redux-App). "Anzeige des nächsten und vorherigen Eintrags" --- es wird erwartet, dass die entsprechend benannten Aktionen wie "NEXT" und "PREV" oder so aussehen. Ansonsten, Entschuldigung :-) – zerkms

+0

"Eine einzige Reduzierung ist keine Option" --- warum ist das? Es spielt keine Rolle, was das Ereignis auslöst/löst eine Aktion aus. Die Geschäftsstruktur sollte nicht von Ihrer Benutzeroberfläche abhängen. – zerkms

Antwort

2

Die idiomatische Lösung ist, Ihre Reducer-Logik in ein Thunk mit einem Middleware-Paket wie redux-thunk (oder ähnlich) zu übertragen.

Damit können Sie spezielle Arten von actions als Funktionen behandeln, was bedeutet, dass Sie eine einfache Aktion mit spezifischer aktionsbezogener Logik erweitern können. Das Beispiel, das Sie angeben, um auf den Zustand zugreifen zu können, um die Aktionslogik bedingt zu bestimmen, ist ein ausgezeichneter Anwendungsfall für redux-thunk.

Unten ist ein Beispiel, wie Sie die Logik aus Ihrem Reducer in einen Thunk ziehen können. Sie sollten beachten, dass Thunks im Gegensatz zu Reduzierern explizit den Abrufstatus unterstützen und nachfolgende Aktionen über die Funktionen getState und dispatch versenden.

Thunk Beispiel

export const increment=() => { 
    return (dispatch, getState) => { 
    const state = getState() 
    const delta = (state.random) ? getRandomNumber() : 1 
    dispatch({ 
     type: INCREMENT, 
     delta 
    }) 
    } 
} 

export function currentIndex(state = null, action) { 
    switch (action.type) { 
    case types.INCREMENT: 
     return state + action.delta 
    } 
} 
+0

Danke für die Antwort. Ich benutze bereits Thunks und habe dies als eine Lösung betrachtet, war mir aber nicht sicher, ob es der richtige Weg war. Ich werde damit gehen. Danke für deine Zeit :) –

+0

Ich bin froh, dass ich helfen kann. Können Sie die Antwort als akzeptiert markieren und, wenn Sie sich großzügig fühlen, geben Sie eine Antwort. Ta. – biofractal

+0

Natürlich. Erledigt –