2016-06-23 13 views
8

Dostaję błędu 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.React Redux nieoczekiwany klucz przeszedł do tworzenia przechowywać odnośniki

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; 
    } 
} 

sklepu:

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; 

I mają bardzo podobny kod w innej aplikacji i działa dobrze. Nie wiem, co tu się dzieje

Odpowiedz

7

Istnieje niewielka niezgodność między tym, co ustawiono jako stan początkowy sklepu, a tym, co użytkownik mówi sklepowi, aby oczekiwać początkowego stanu sklepu, np. - zaktualizuj ustawienie Twój stan początkowy dla magazynu jako takie:

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

A także, że to dobry pomysł, aby nazwać swój stan posiadaczy zmiennych drzewa do sensownych nazw, które nie zawierają reduktor w nich, więc aktualizować

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

do

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

I to powinno wystarczyć dla Ciebie.

Mam nadzieję, że to pomoże,

PS. niektórzy doktorzy.

Od the docs:

Jeśli produkowane reduktor z combineReducers, musi to być zwykły obiekt o takim samym kształcie jak przekazane do niego klucze. W przeciwnym razie możesz przekazać wszystko, co twój reduktor może zrozumieć.

Jeśli nie trzeba obsłużyć wszelkie działania związane z one lub two, wystarczy pociągnąć je początkowo, to może być tak proste, jak

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

ustawiając stan początkowy jako tę samą nazwę atrybutu co reduktor, czy to ostatecznie przesłoni reduktor? – erichardson30

+1

@ erichardson30 Nie - po prostu ustawi stan początkowy, nie zastąpi reduktora. Oto trochę więcej wskazówek od [dokumentacji redux] (http://redux.js.org/docs/api/createStore.html) '[initialState] (dowolny): stan początkowy. Opcjonalnie można go określić, aby uwznioślał stan z serwera w aplikacjach uniwersalnych lub aby przywrócić wcześniej serializowaną sesję użytkownika. Jeśli wyprodukowałeś reduktor za pomocą funkcji CombineReducers, musi to być zwykły obiekt o tym samym kształcie, co klawisze do niego przekazywane. W przeciwnym razie możesz przekazać wszystko, co zrozumie Twój reduktor. " –

+0

" Istnieje niewielka niezgodność między tym, co ustawiasz jako stan początkowy sklepu, a tym, co mówisz sklepowi, aby oczekiwał, jaki powinien być początkowy stan sklepu " Naprawdę nie mogę podążać za tym stwierdzeniem, czy możesz wyjaśnić nieco jaśniej? – stevematdavies

-1

Z documentation dla combineReducers:

combineReducers funkcja pomocnika zamienia obiekt, którego wartości są różne funkcje redukujące do pojedynczej funkcji redukującej możesz podaje do createStore.

Wynikowy reduktor wywołuje każdy reduktor potomny i zbiera jego wyniki do pojedynczego obiektu stanu. Kształt obiektu stanu pasuje do kluczy przekazanego reducers.

Krótko mówiąc, reduktory są skonfigurowane do obsługi stanu w postaci

{ 
    marvelReducer, 
    routing 
} 

ale jesteś wręczając mu stan początkowy w postaci

{ 
    characters 
} 

Aby rozwiązać ten problem musisz albo zmienić klucze obiektu, który przekazałeś, do combineReducers, aby dołączyć characters, albo zmienić stan początkowy tak, aby zawierał klucze, których spodziewają się twoje reduktory.

0

Mam ten sam problem, a ja nie mogę postępuj zgodnie z logiką któregokolwiek z tych potencjalnych rozwiązań.

Argumenty dla CombineReducers są odniesieniami do obiektów redukujących, a nie do stanu, kluczy. Kluczowy błąd jest równie tajemniczy jak większość innych błędów redux, a nawet większość odpowiedzi lub potencjalnych rozwiązań oferowanych im.

+0

Czy możesz opublikować, jak wygląda twój reduktor/stan? Co odpowiedź stara się wyjaśnić to, że jeśli masz reduktor korzeniowy, który wygląda jak 'const rootReducer = combineReducers ({ Marvel marvelReducer, routingu: routerReducer });' wówczas państwo powinno zawierać przedmiot Marvel i obiekt routingu ze wszystkimi właściwościami wewnątrz nich – erichardson30

Powiązane problemy