Реагировать неожиданный ключ 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
, либо изменить исходное состояние, чтобы содержать ключи, которые ожидают ваши редукторы.