2016-11-18 5 views
1

Vielleicht wurde dies bereits beantwortet, aber ich habe Schwierigkeiten, die Antwort zu finden.Access State von einem anderen Reducer React/Redux

Ich habe Reduzierer mit ihrem eigenen Anfangszustand. Gibt es einen Weg (natürlich gute Praxis), um von einem Reduzierer auf den Ausgangszustand zuzugreifen?

Reducer One:

const initialState = Immutable.fromJS({ loadData: [] }) 

const reducerOne = (state = initialState, action) => { 
    switch (action.type) { 
    case SELECT_REPORT_FORMAT: { 
     return state.merge({ loadData: state.get('loadData') }); 
    } 
    .... 
} 

Reducer Two:

const initialState = Immutable.fromJS({ newData: [] }); 
const reducerTwo = (state = initialState, action) => { 
    switch (action.type) { 
    case GET_NEW_DATA: { 
     // Is there a way to "call" the SELECT_REPORT_FORMAT in 
     // reducerOne and get its new state (state.get('loadData')) from here? 
     // I did add case SELECT_REPORT_FORMAT in this reducer, and 
     // it did get called, but the state is with the property of 
     // newData, which makes sense. I need to access the loadData 
     // array from here. 
     return state.merge({ newData: state.get('loadData') }); 
    } 
    .... 
} 

Dank!

Antwort

0

Ich sehe nicht den Schaden beim Exportieren initialState und importieren, wo benötigt!

Fügen Sie einfach export const initialState = yourStuff hinzu und importieren Sie es dann von Ihrem anderen Reduzierer.

+0

Vielen Dank für die Antwort, aber ich muss die Endergebnisse des Ausgangszustands nach seinem Aufruf von "SELECT_REPORT_FORMAT" in Reduzierer eins erhalten. – FNMT8L9IN82

+0

Ich meine, ich brauche den Rückgabewert von state.merge ({loadData: state.get ('loadData')}}) in Reducer zwei. – FNMT8L9IN82

+0

Ok, also nicht der Ausgangszustand, du hast den Zustand nach einigen Aktionen gesagt. In diesem Fall, nein, sollten Sie nicht in den Zustand anderer Reduzierungen greifen, da dies die Kapselung unterbrechen würde und unendliche Schleifen verursachen könnte. Warum lässt eine Komponente keine Aktion auslösen, die ReducerA als Reaktion auf eine Zustandsänderung durch ReducerB verwendet? – ZekeDroid

0

Zuerst

return state.merge({ loadData: state.get('loadData') }); 

nicht wirklich Sinn machen. Aber auf jeden Fall würde ich vorschlagen, den gleichen Wert für initialState zu verwenden. Das bedeutet, dass die Art und Weise, wie Sie es jetzt haben, in Ordnung ist - für beide Reduzierungen sind loadData und newData jeweils leere Arrays.

Danach, wenn ein actionCreator mit type: GET_DATA und payload: {data: 'blahBlah'} aufgerufen wird, alles, was Sie tun müssen, ist, diese Aktion von beiden Reduzierern zu erhalten.

const initialState = Immutable.fromJS({ loadData: [] }) 
const reducerOne = (state = initialState, action) => { 
    switch (action.type) { 
    case GET_DATA: { 
     return state.merge(fromJS({ loadData: action.payload.data) })); 
    } 
    .... 
} 

und

const initialState = Immutable.fromJS({ newData: [] }); 
const reducerTwo = (state = initialState, action) => { 
    switch (action.type) { 
    case GET_DATA: { 
     return state.merge(fromJS({ newData: action.payload.data) })); 
    } 
    .... 
} 

Wo action.payload.data die loadData Sie versuchen, in Ihrer Frage zu kommen. Hoffe es hilft :)

Verwandte Themen