combineReducer приводит к тому, что свойствам присваивается значение undefined

#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} .