#redux #reducers
#redux #редукторы
Вопрос:
Представьте, что у меня есть следующий простой редуктор
let reducer = (prevState = {}, action) => {
return {
A: A(prevState.A, action),
B: B(prevState.B, action)
}
};
let A = B = (prevState, action) => {
if (action.type == 'foo')
return 'bar';
else
return prevState;
};
Любое действие, в частности @@INIT, приведет к тому, что мое состояние станет {A: undefined, B: undefined}
. Это не идеально, потому что предполагается, что мое состояние все еще должно быть {}
сейчас
Это происходит потому, что я следую шаблону combineReducer. В любом случае, чтобы обойти это?
Комментарии:
1. редукторы должны иметь некоторое неопределенное начальное состояние, иначе вы получите: «Reducer » …» возвращается неопределенным во время инициализации. Если состояние, переданное редуктору, не определено, вы должны явно вернуть начальное состояние. Начальное состояние не может быть неопределенным «.. Итак, как вы где-то предложили в своем комментарии, это сводилось бы к использованию чего-то вроде null, если вы хотите использовать начальное состояние, подобное пустому.
Ответ №1:
Ваши редукторы не предоставляют начальное значение состояния для prevState
. Итак, при первом запуске A()
or B()
prevState
значение не определено и возвращается.
Новый раздел «Структурирующие редукторы» в документации Redux описывает это в руководстве «Состояние инициализации».
Комментарии:
1.Их начальное значение должно быть «отсутствует», не существовать. Означает ли это, что я должен добавлять предположения, как
A(prevState = null)
B(prevState = -1)
везде? Предполагается, что эти свойства не должны иметь «начальное значение»2. Вам не нужно указывать начальные значения. Но, если вы не сделаете что- то другое, прямо сейчас вы определенно получите
{A: undefined, B: undefined}
.