Почему CombineReducers не получает состояние в Redux?

Когда я смотрю на редьюсер, вызываемый через combineReducers, он не получает состояние или действие в аргументах.

Мой файл редукторов таков:

import { combineReducers } from 'redux';
import nav from './reducers/nav';
import pages from './reducers/pages';
import entities from './reducers/entities';

export default function(initialData) {

  return function(state, action) {
    if (!state) {
      console.log('no state', initialData);
      return initialData;
    }

    // This is showing state as having expected value
    console.log('state', state);

    return combineReducers({
      nav,
      pages,
      entities
    });
  }
};

Инициализация моего магазина выглядит так:

import reducerWrapper from './reducers';

// Initial state is defined above
var reducers = reducerWrapper(initialState),
    store = Redux.createStore(reducers, initialState);

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

Обновлено Вот файл редукторов:

import { combineReducers } from 'redux';
import nav from './reducers/nav';
import pages from './reducers/pages';
import entities from './reducers/entities';

export default combineReducers({
  nav,
  pages,
  entities
});

за которым следует store = Redux.createStore(reducerWrapper, initialState), также не работает, даже когда я удаляю оболочку внутри reducerWrapper и просто экспортирую combReducers по умолчанию`


person Dave Stein    schedule 14.04.2016    source источник


Ответы (2)


Здесь не так-то просто было найти ответ. Проблема в том, что у моего редуктора не было состояния по умолчанию.

Магазин запускает событие INIT здесь: https://github.com/reactjs/redux/blob/master/src/createStore.js#L204

Затем он в конечном итоге попадает сюда: https://github.com/reactjs/redux/blob/master/src/combineReducers.js#L52

Это означает, что если мой редуктор function (state, action) { return state }, а не function (state='anyDefaultValue') { return state }, combineReducer выдаст ошибку, говоря, что редуктор не вернул состояние

person Dave Stein    schedule 14.04.2016

combineReducers возвращает функцию, которую необходимо вызвать с помощью state и action. Вы можете просто экспортировать это напрямую:

const rootReducer = combineReducers(...);
export default rootReducer;

Или вы можете обернуть его так, как вы сейчас:

const rootReducer = combineReducers(...);
export default function (initialData) {
  return function (state, action) {
    if (!state) {
      console.log('no state', initialData);
      return initialData;
    }

    // This is showing state as having expected value
    console.log('state', state);

    return rootReducer(state, action);
  }
}
person jeffora    schedule 14.04.2016