Установка начального состояния в субредукторах Redux

Я знакомлюсь с концепцией композиции редукторов в Redux, и я был сбит с толку тем, как должно быть установлено начальное состояние в субредюсерах.

Аналогичный вопрос был этот, но он касается только редукторов верхнего уровня для каждой части дерева состояний.

Насколько я понимаю, каждый редьюсер должен предоставлять начальное состояние той части дерева состояний, за которую он отвечает.

Например, если бы у меня было такое дерево состояний:

{
  dashboard:{
    stats:{
      sales:23,
      purchases:22
    },
    messages:{
      unread:3,
      draft:5
    },
    //...etc
  },
  //...
}

И у меня был один редюсер верхнего уровня для дашборда, а так же редюсеры для stats и messages, должно ли исходное состояние для частей дашборда задаваться в редюсере дашборда, или в редьюсерах для каждой части, и если да, то как бы этот код выглядит?

Моя первоначальная мысль заключалась в том, чтобы реализовать редьюсер приборной панели следующим образом:

const initialState = {
  stats: {},
  messages: {},
  //...
}

export default function dashboard(state = initialState, action) {
  switch (action.type) {
    case FETCH_STATS:
    case FETCH_STATS_SUCCESS:
    case FETCH_STATS_FAILURE:
      return {
        ...state,
        stats: stats(state.stats, action)
      }
    case FETCH_MESSAGES:
    case FETCH_MESSAGES_SUCCESS:
    case FETCH_MESSAGES_FAILURE:
      return {
        ...state,
        messages: messages(state.messages, action)
      }
      //...any other action cases
    default:
      const combined = combineReducers({
        stats,
        messages
      })
      return {
        ...state, //for any part without a reducer
        ...combined
      }
  }
}

Верны ли мои рассуждения? Любые предложения по улучшению также приветствуются.


person George Fourmouzis    schedule 10.03.2017    source источник


Ответы (1)


Либо будет работать. Единственное, что приходит на ум, это то, что без начального состояния это не соответствует определению редуктора Redux; он не будет работать изолированно, поскольку Redux ожидает, что начальное состояние не будет неопределенным.

В любом случае довольно безобидно установить начальное состояние субредьюсера как

export default function stats(state = {}, action) {
    // ... whwtever
}
person Radio-    schedule 10.03.2017