Почему редукторный редуктор получает «неопределенное» вместо исходного состояния? - PullRequest
0 голосов
/ 27 октября 2018

Я создаю игрушечный пример с NodeJS и redux.Я создаю хранилище следующим образом:

var initialState = {config: defaultConfig, customData: data};
const store = createStore(reducers, initialState)

Я проверяю, определены ли defaultConfig и data, т.е. я действительно останавливаю отладчик перед оператором и могу подтвердить, что конфигурация действительно там.Однако внутри редукторов состояние равно undefined.Почему?!

Редукторы:

const configReducer = (config: any, action: any): any =>{
        return config;
}

const customData = (customData: any, action: any): any =>  {
        return customData;
}
const reducers = combineReducers({config: configReducer, customData: customDataReducer})

Итак, я явно задаю начальное состояние, но при этом получит редукс вызовы с undefined.

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

Вопрос в том, почему это не работает, если я передаю исходное состояние при создании магазина.

Ответы [ 3 ]

0 голосов
/ 21 июня 2019

Задание начального состояния при создании магазина не инициализирует ваш магазин. Вы должны явно установить начальное состояние в редукторах.

Пожалуйста, обратитесь Почему я получаю «Reducer [...] возвращенный неопределенным во время инициализации», несмотря на предоставление initialState для createStore ()?

0 голосов
/ 01 июля 2019

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

export default function itemReducer(state = initialState.items | undefined, action){ 
    switch(action.type) 
   { 
         case "LOAD_ITEMS_SUCCESS":
               if(action.items==undefined) { 
                        action.items=[]; 
               }
                return action.items

Если редуктор становится неопределенным, тогда замените неопределенное для пустого массива, и вы больше не получите эту ошибку.

Приветствия!

0 голосов
/ 27 октября 2018

Это поведение относится только к combineReducers:

Любой редуктор, передаваемый наcellReducers, должен удовлетворять этим правилам:

  • Длялюбое действие, которое не распознано, должно возвращать состояние, данное ему в качестве первого аргумента.

  • Никогда не должно возвращаться неопределенное.Слишком легко сделать это по ошибке с помощью оператора раннего возврата, так что Если возбуждается, если вы сделаете это, то будет использовать throwReducers вместо того, чтобы позволить ошибке проявиться где-то еще.

  • Если ему присвоено состояниене определено, оно должно возвращать начальное состояние для этого конкретного редуктора.Согласно предыдущему правилу, начальное состояние также не должно быть неопределенным.Удобно указывать его с помощью синтаксиса необязательных аргументов ES6, но вы также можете явно проверить первый аргумент на предмет неопределенности.

При combineReducers редуктор равен изначально вызывается с undefined, чтобы утверждать, что это не нарушает эти правила.Только тогда он будет вызываться с initialState.

. Таким образом, initialState предназначен для гидратации состояния с начальными значениями, а не с значениями по умолчанию .

Редуктор должен иметь возможность обрабатывать непредвиденное состояние при неожиданном действии (пункт default в switch), в этом случае начальное значение должно быть любым, кроме undefined, например:

const configReducer = (config: any = null, action: any): any =>{
        return config;
}

const customData = (customData: any = null, action: any): any =>  {
        return customData;
}
...