Реагировать неожиданный ключ Redux для создания хранилища

Я получаю сообщение об ошибке Unexpected key "characters" found in initialState argument passed to createStore. Expected to find one of the known reducer keys instead: "marvelReducer", "routing". Unexpected keys will be ignored.

rootReducer:

 import { combineReducers } from 'redux';
 import { routerReducer } from 'react-router-redux';
 import marvelReducer from './marvelReducer';

 const rootReducer = combineReducers({
   marvelReducer,
   routing: routerReducer
 });
 export default rootReducer;

marvelReducer:

import { FETCH_MARVEL } from '../constants/constants';
import objectAssign from 'object-assign';

export default function marvelReducer(state = [], action) {
  switch (action.type) {
    case FETCH_MARVEL:
      return objectAssign({}, state, {characters: action.data});

    default:
      return state;
  }
}

store:

import { createStore } from 'redux';
import { syncHistoryWithStore } from 'react-router-redux';
import { browserHistory } from 'react-router';

import rootReducer from '../reducers/index';

const initialState = {
  characters: []
};

const store = createStore(rootReducer, initialState);

export const history = syncHistoryWithStore(browserHistory, store);

if (module.hot) {
  module.hot.accept('../reducers/', () => {
    const nextRootReducer = require('../reducers/index').default;
    store.replaceReducer(nextRootReducer);
  });
}

export default store;

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

Ответ 1

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

const initialState = {
   marvel: {
     characters: []
   }
};

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

const rootReducer = combineReducers({
   marvelReducer,
   routing: routerReducer
});

to

const rootReducer = combineReducers({
   marvel: marvelReducer,
   routing: routerReducer
});

И это должно сделать трюк для вас.

Надеюсь, что это поможет,

PS. некоторые документы.

Из документов:

Если вы создали редуктор с combReducers, это должен быть простой объект с той же формой, что и ключи, переданные ему. В противном случае вы можете передавать все, что может понять ваш редуктор.

Если вам не нужно обрабатывать какие-либо действия, связанные с one или two, просто вытащите их изначально, это может быть так же просто, как

export default combineReducers({
  events,
  flash,
  one: (state = {}) => state,
  two: (state = {}) => state
})

Ответ 2

Чтобы добавить к elod ответ, Объект состояния хранилища имеет разные свойства или разные разделы данных:

{a:data,b:data,c:data}

Когда вы комбинируете редукторы, вы ДОЛЖНЫ отобразить каждое свойство объекта состояния на другой редуктор

{a:reducerOfDataA,b:reducerOfDataB,c:reducerOfDataC}

Это механизм в Redux, который обеспечивает разделение данных для каждого редуктора, reducerOfDataA не может изменять данные reducerOfDataB. Это означает, что все данные reducerOfDataA должны находиться в {a:...} и не разделяться под различными свойствами непосредственно в корневом объекте состояния {partA1:..., partA2:...}

Я потратил всю ночь, чтобы понять это, надеюсь, этот маленький комментарий спасет ваш.

Ответ 3

У меня такая же проблема, и я не могу следовать логике любого из этих потенциальных решений.

Аргументы для combReducers - это ссылки на объекты редуктора, а не состояния, ключи. Ключевая ошибка столь же загадочна, как и большинство других ошибок сокращения, и действительно большинство ответов или потенциальных решений, предлагаемых им.

Ответ 4

Из документации для combineReducers:

Вспомогательная функция combineReducers превращает объект, значения которого различные функции уменьшения в единую функцию сокращения можно перейдите к createStore.

Получаемый редуктор вызывает каждый дочерний редуктор и собирает их результаты в один объект состояния. Форма объекта состояния соответствует клавишам пройденного reducers.

Короче говоря, ваши редукторы сконфигурированы для обработки состояния в форме

{
    marvelReducer,
    routing
}

Но вы передаете ему начальное состояние в виде

{
    characters
}

Чтобы устранить эту проблему, вам придется либо изменить ключи объекта, который вы передаете, на combineReducers, чтобы включить characters, либо изменить исходное состояние, чтобы содержать ключи, которые ожидают ваши редукторы.