Установить состояние редуктора и его суб-редукторов при использовании combReducers - PullRequest
0 голосов
/ 16 февраля 2019

Я расширяю функциональность локального приложения React для подключения к API.Вот мой код перед рефакторингом.Вы увидите, что я устанавливаю начальное состояние из глобальной переменной окна, INIT_STATE, которая также включает некоторые другие объекты корневого уровня.

Я сосредоточусь на одном из этих объектов корневого уровня, который называется "projects ".

Для редуктора проектов я нормализировал (используя normalizr) состояние, подобное этому, и комбинировал редукторы, чтобы использовать редукторы для нормализованных сущностей:

window.PROJECTS_STATE = fromJS(normalize(window.INIT_STATE.projects, projectsSchema));

const result = (state = window.PROJECT_STATE.get('result'), action) => {
  switch (action.type) {
    default:
      return state;
  }
};

// In these reducers, currently, I'm getting init_state from window.PROJECTS_STATE
// i.e. window.PROJECT_STATE.entities.projects), which has been normalized above
const entities = combineReducers({
  projects,
  items,
  events,
});


// Here is where I'd like to handle an action to normalize and 
// overwrite the state of `projects` and all it's sub-reducers
export default () => combineReducers({
  entities,
  result,
});

В моем рефакторе Iотправил действия для получения и получения запросов API в моем контейнере верхнего уровня.Я могу легко установить свое начальное состояние других объектов корневого уровня из того, что было в INIT_STATE, обработав действие GET_REQUEST_SUCCESS в этих редукторах, чтобы вернуть эту часть ответа, но так как projects нормализовано и имеет вложенный элемент sub.-reducers, я не уверен, как справиться с установкой этого состояния с помощью CombReducers.

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

Большое спасибо.

1 Ответ

0 голосов
/ 16 февраля 2019

Из того, что я вижу, вы хотите сохранить и повторно гидрировать некоторое сохраненное состояние в состояние редукторов, Redux persist был специально разработан для этой цели, вы можете настроить blacklist илиwhitelist для каждого редуктора, для которого вы хотите сохранить или не сохранять состояние, это может помочь вам выполнить то, что вы хотите.

Однако, если вы все еще хотите восстановить состояние всего дерева в одномиди, боюсь, это может оказаться невозможным (насколько я знаю), это как бы идет вразрез с функциональной природой редукса (без побочных эффектов), изменение состояния всех редукторов от редуктора высокого уровня - большаяпобочный эффект, combineReducers - это не более чем просто упаковочные редукторы в связке, но логически они все (должны) оставаться отсоединенными.

При этом можно сказать, что вы можете попытаться изменить свое действие в промежуточное программное обеспечение до того, как каждый редуктор обрабатывает его, но нет никакого смысла в том, что reducer -> catch action -> new state и что ВСЕ редукторы получают ВСЕ действия, в этом вся проблемаДукс пытается решить, обход его делает недействительным точку библиотеки.

...