2016-06-23 14 views
8

sto ottenendo l'errore 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.Reagire Redux chiave inaspettato passata per creare negozio

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

negozio:

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 avere un codice molto simile in un'altra applicazione e sta funzionando bene. Non so che cosa sta succedendo qui

risposta

7

C'è una piccola discrepanza tra quello che si imposta come stato iniziale del negozio e quello che si dice al negozio di aspettarsi quale dovrebbe essere lo stato iniziale del negozio, ad es. - aggiornare l'impostazione vostro stato iniziale per il negozio in quanto tale:

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

E inoltre è una buona idea dare un nome alle statali titolari variabile dell'albero a nomi significativi che non contengono riduttore in loro, in modo da aggiornare

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

a

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

E che dovrebbe fare il trucco per voi.

Spero che questo aiuti,

PS. alcuni documenti.

Da the docs:

Se prodotta riduttore con combineReducers, questo deve essere un oggetto semplice con la stessa forma dei tasti passati ad esso. Altrimenti, sei libero di passare tutto ciò che il tuo riduttore può capire.

Se non è necessario per gestire ogni azione relativa allo one o two, basta tirare in un primo tempo, questo potrebbe essere semplice come

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

impostazione dello stato iniziale come lo stesso nome attributo del riduttore, finisce per ignorare il riduttore? – erichardson30

+1

@ erichardson30 Non lo fa - semplicemente imposta uno stato iniziale, non sovrascrive il riduttore. Ecco un altro piccolo consiglio da [i documenti redux] (http://redux.js.org/docs/api/createStore.html) '[initialState] (any): Lo stato iniziale. Opzionalmente è possibile specificarlo per idratare lo stato dal server in applicazioni universali o per ripristinare una sessione utente precedentemente serializzata. Se hai prodotto un riduttore con CombinazioneRiduttori, questo deve essere un oggetto semplice con la stessa forma dei tasti passati ad esso. Altrimenti, sei libero di passare tutto ciò che il tuo riduttore può capire. –

+0

"C'è una piccola discrepanza tra ciò che si imposta come lo stato iniziale del negozio e ciò che si dice al negozio di aspettarsi quale dovrebbe essere lo stato iniziale del negozio" Non riesco davvero a seguire questa affermazione, puoi elaborare un po 'più chiaro? – stevematdavies

-1

Dal documentation per combineReducers:

La funzione di supporto combineReducers trasforma un oggetto i cui valori sono diverse funzioni che riducono in un'unica funzione di riduzione si può passa a createStore.

Il riduttore risultante chiama ogni riduttore figlio e raccoglie i risultati in un singolo oggetto di stato. La forma dell'oggetto stato corrisponde alle chiavi del passaggio reducers.

In breve, i vostri riduttori sono configurati per gestire uno stato sotto forma di

{ 
    marvelReducer, 
    routing 
} 

Ma tu sei di consegnarlo uno stato iniziale in forma di

{ 
    characters 
} 

Per risolvere questo problema problema, dovrai cambiare le chiavi dell'oggetto che passi a combineReducers per includere characters o cambiare lo stato iniziale per contenere le chiavi che i tuoi riduttori si aspettano.

0

Ho lo stesso problema, e non posso segui la logica di ognuna di queste potenziali soluzioni.

Gli argomenti per combinare i Redattori sono riferimenti agli oggetti riduttore, non allo stato, alle chiavi. L'errore chiave è criptico come la maggior parte degli altri errori di redux, e in effetti la maggior parte delle risposte o delle potenziali soluzioni offerte a loro.

+0

Puoi postare l'aspetto del tuo riduttore/stato? Che la risposta sta cercando di spiegare è che se si dispone di un riduttore di radice che assomiglia 'const rootReducer = combineReducers ({ Marvel: marvelReducer, di routing: routerReducer });' quindi il tuo stato dovrebbe contenere un oggetto Marvel e un oggetto di routing con tutte le proprietà al suo interno – erichardson30