#redux #reducers
#сокращение #редукторы
Вопрос:
У меня есть приложение react / redux с магазином, настроенным следующим образом:
interface AppState {
substateA: SubstateA;
substateB: SubstateB;
}
И два редуктора, управляющих своими отдельными состояниями:
const reducer = combineReducers<AppState>({
substateA: reducerA,
substateb: reducerB,
});
Что я хотел бы сделать, так это добавить редуктор, который управляет целым состоянием дополнительно к этим двум редукторам. Как я могу это сделать или есть другое лучшее решение?
Ответ №1:
Редуктор — это просто функция, которая принимает состояние и действие и возвращает новый объект состояния.
combineReducers
возвращает редуктор, который вызывает каждый из ваших редукторов только с их фрагментом состояния.
Поиграйте с чем-нибудь подобным.. возможно, вы захотите, чтобы сначала были запущены комбинированные редукторы или ваш глобальный редуктор состояния, в зависимости от того, что вы делаете.
const combinedReducer = combineReducers<AppState>({
substateA: reducerA,
substateb: reducerB,
});
const reducer = (state, action) => {
state = reducerC(state, action);
return combinedReducer(state, action);
}
Комментарии:
1. Спасибо за решение, сейчас вызываются оба редуктора, но у меня другая проблема, которая напрямую не связана. Я сохраняю экземпляры классов с методом в хранилище, и, похоже,
this
при вызове метода указывает на неправильный объект.2. хм, да, не делай этого. В хранилище должны быть только простые объекты / массивы / строки.
3. И есть ли у вас какие-либо предложения, как сделать это каким-либо другим способом? У меня в основном есть сохраненная группа объектов с уникальными идентификаторами, которые все являются производными от общего класса и имеют свой собственный
serialize
метод. И я хотел бы иметь возможность просто сериализовать все объекты (они создают древовидную структуру и ссылаются друг на друга по идентификаторам)4. повторно не сериализуемые элементы в хранилище .. redux.js.org/faq / … , хотя вы уже обнаружили проблему. организация вложенных данных .. redux.js.org/faq / … в принципе, вы должны стремиться сериализовать и нормализовать данные и создать набор селекторов для извлечения необходимых вам данных из хранилища. Нормализация данных he значительно упрощает создание редукторов для управления данными хранилища
5. Хорошо, но куда мне поместить мои пользовательские методы сериализации? Возможно, они будут работать как статические методы, которые принимают обычный объект из хранилища в качестве аргумента? Как бы я затем динамически отправлял, чтобы исправить реализацию производного типа? Все классы имеют уникальный строковый литерал.