2016-11-18 2 views
1

Возможно, на это был дан ответ раньше, но мне трудно найти ответ.Состояние доступа от другого редуктора React/Redux

У меня есть редукторы со своим исходным состоянием. Есть ли способ (хорошая практика, конечно) получить доступ к исходному состоянию из одного редуктора?

Reducer Один:

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 Два:

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') }); 
    } 
    .... 
} 

Спасибо!

ответ

0

Я не вижу вреда при экспорте initialState и импортируя его там, где необходимо!

Так что просто добавьте export const initialState = yourStuff, а затем импортируйте его из другого редуктора.

+0

Спасибо за ответ, но мне нужно получить конечные результаты начального состояния после его вызова из «SELECT_REPORT_FORMAT» в редукторе. – FNMT8L9IN82

+0

Я имею в виду, мне нужно вернуть значение state.merge ({loadData: state.get ('loadData')}) внутри редуктора два. – FNMT8L9IN82

+0

Итак, не первоначальное состояние вообще, вы хотели сказать состояние после того, как некоторые действия были уволены. В этом случае нет, вы не должны попасть в состояние других редукторов, так как это нарушит инкапсуляцию и может вызвать бесконечные циклы. Почему бы не включить компонентный огонь в действие, которое использует редуктор в ответ на изменение состояния, вызванное редуктором B? – ZekeDroid

0

Во-первых,

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

не имеет смысла, на самом деле. Но в любом случае я бы предложил использовать то же значение для initialState. Это означает, что способ, которым у вас есть это сейчас, прекрасен - для обоих редукторов loadData и newData соответственно будут пустым массивом.

После этого, когда вызывается actionCreator с type: GET_DATA и payload: {data: 'blahBlah'}, все, что вам нужно сделать, это получить это действие от обоих редукторов.

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

и

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

Где action.payload.data это loadData вы пытаетесь получить в вашем вопросе. Надеюсь, это поможет :)

Смежные вопросы