2017-04-01 1 views
1

ich mit einem Bündel von Reduzierungen auf einem Redux Projekt arbeite, dieIst es möglich, einen Selektor zu erstellen, der auf mehrere Zweige des Statusbaums zugreift?

const rootReducer = combineReducers({ 
    reducer1, 
    reducer2, 
    ... 
}); 

Die Reduzierungen jedes Update ein Zweig des Ladens

sampleStore = { 
    reducer1: {a1: 7, b1: 5, c1: 6, ...}, 
    reducer2: {a2: 3, b2: 2, c2: 9, ...}, 
    reducer3: {a3: 1, b3: 4, c3: 2, ...}, 
    ... 
} 

Jetzt kombiniert Ich versuche Logik hinzuzufügen, dass der Zugang erfordert zu beiden Filialen des Geschäfts, ohne das gesamte Projekt umzustrukturieren. Zum Beispiel möchte ich einen Reducer mit der Fähigkeit zu erfüllen: set c3 = f(a1, a2).

Im Moment versuche ich erneut zu wählen, aber ich verliere mich. In reducer1/selector.js habe ich

export const derivedVariableSelector = createSelector(
    a1Selector, 
    a2Selector, 
    (a1, a2) => a1 + a2 
); 

Und ich versuche ein Reduktions

function setC3(state) { 
    return Object.assign({}, state, { 
     c3: state.c3 + derivedVariableSelector(state) 
    }); 
} 

jedoch zu schaffen, wenn setC3 aufgerufen wird, wird derivedVariableSelector nie genug Speicher erhalten, seine Arbeit zu tun. Entweder erhält es den Zweig, der a1 enthält, oder den Zweig, der a2 enthält, aber ich kenne keine Möglichkeit, beides zu liefern. Ist das möglich?

Antwort

2

Die kurze Antwort lautet „Nein“, so lange, wie Sie combineReducers verwenden alle Reduzierungen zu kombinieren.

Die längere Antwort ist aus den redux documentation genommen:

Der combineReducers-Dienstprogramm, mit Redux sehr nützlich ist, sondern bewusst einen einzigen gemeinsamer Anwendungsfall zu behandeln beschränkt: einen Zustandsbaum zu aktualisieren, die a Einfaches JavaScript-Objekt, indem die Arbeit des Aktualisierens jedes Statussegments an einen bestimmten Slice Reducer delegiert wird. Es tut nicht behandeln andere Anwendungsfälle, wie ein Zustand Baum aus Immutable.js Maps, versuchen, andere Teile des Zustandsbaums als ein zusätzliches Argument zu einem Slice Reducer, oder die Durchführung "Bestellung" von Scheibe Minderer ruft. Es ist auch egal, wie ein gegebener Slice Reducer seine Arbeit macht.

Die allgemeine Frage ist dann, "Wie kann ich combineReducers verwenden, um diese anderen Anwendungsfälle zu behandeln?". Die Antwort darauf ist einfach: „Sie tun nicht - Sie wahrscheinlich etwas anderes verwenden müssen“. Sobald Sie den Kern Anwendungsfall für combineReducers gehen vorbei, ist es Zeit, mehr „custom“ Minderer Logik zu verwenden, wäre es für einen einmaligen Anwendungsfall spezifische Logik sein oder eine wiederverwendbare Funktion, die weit geteilt werden könnte.

Auf der gleichen Seite der docs sind einige Vorschläge für how the create reducers that share more of the state aber es wird ein bisschen mehr manuell sein als comibineReducers ist.

Ich habe nichts dergleichen mich vorher versucht, aber folgende Beispiele in der Dokumentation, so etwas wie dies für Sie arbeiten könnte:

import { combineReducers } from 'redux' 
import reduceReducers from 'reduce-reducers' 

const reducer1 = (state = {}, action) => { 
    switch (action.type) { 
     // handle actions 
     default: 
      return state 
    } 
} 

const reducer2 = (state = {}, action) => { 
    switch (action.type) { 
     // handle actions 
     default: 
      return state 
    } 
} 

const reducer3 = (state) => { 
    return { 
     ...state, 
     // use the root state for the reducerC value 
     reducerC: makeValue(state.reducer1, state.reducer2) 
    } 
} 

const rootReducer = reduceReducers(combineReducers({reducer1, reducer2}), reducer3) 

Dies verwendet die Bibliothek reduce-reducers Reduzierungen in einer anderen Art und Weise zu kombinieren.

+0

perfekt funktioniert, danke. –

Verwandte Themen