2016-04-04 9 views
13

Non sono stato in grado di trovare nulla intorno a questo errore "Il negozio non ha un riduttore valido. Assicurati che l'argomento passato a combineReducers è un oggetto i cui valori sono riduttori.", probabilmente perché è troppo stupido.Il redux store non ha un riduttore valido

mio riduttore

export default function FriendListReducer(state = {friends : []}, action) { 
    switch (action.type) { 
    case 'ADD_FRIEND': 
     return [ 
     { friends : action.payload.friend }, ...state.friends 
     ]  
    default: 
     return state; 
    } 
    return state; 
} 

combinatore

import { combineReducers } from 'redux'; 
import { FriendListReducer } from './FriendListReducer'; 

const rootReducer = combineReducers({ 
    friends: FriendListReducer 
}); 
export default rootReducer; 

Il mio negozio config

import { applyMiddleware, createStore } from 'redux'; 
import thunkMiddleware from 'redux-thunk'; 
import createLogger from 'redux-logger'; 
import rootReducer from '../reducers/reducers'; 

export default function configureStore(initialState = { friends: [] }) { 
    const logger = createLogger({ 
    collapsed: true, 
    predicate:() => 
    process.env.NODE_ENV === `development`, // eslint-disable-line no-unused-vars 
    }); 

    const middleware = applyMiddleware(thunkMiddleware, logger); 

    const store = middleware(createStore)(rootReducer, initialState); 

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

    return store; 
} 

risposta

20

La vostra dichiarazione import non è corretta. O si utilizza import { Foo } from 'bar' insieme a export Foo, o se si esporta con import Foo from 'bar' se si esporta con export default Foo.

In altre parole, modificare export default function FriendListReducer a export function FriendListReducer oppure modificare l'istruzione di importazione da import { FriendListReducer } a import FriendListReducer.

0

Sembra che la tua funzione di riduttore di primo livello sta usando un array come suo valore di default. Redux si aspetta che il massimo del tuo stato sia un oggetto, non un array. Prova a mettere la matrice su un particolare tasto in quell'oggetto, come { friendList : [] }.

+0

modificato in oggetto e continua a ricevere lo stesso errore – chrysillo

+0

Il valore "initialState" che si sta passando all'archivio non corrisponde alla struttura che si sta creando utilizzando 'combineReducers'. Stai dando a 'combinedReducers' un campo chiamato' FriendListReducer', ma lo stato iniziale del negozio ha 'friends'. Devi far corrispondere quelli in un modo o nell'altro. Dal momento che non corrispondono, hai ancora lo stesso problema. – markerikson

+0

Ho aggiornato il codice e sto ancora ottenendo lo stesso errore, codice aggiornato qui – chrysillo

2

../reducers/reducers? si tratta di una strana denominazione

ogni caso, sembra ../reducers/reducers non restituisce un riduttore, se riduttori è una directory, mettere un index.js all'interno, importare ogni riduttore e creare un riduttore radice

import FriendListReducer from "./FriendListReducer" 

const rootReducer = combineReducers({ 
    friendList : FriendListReducer 
}) 

export default rootReducer 

si avrà lo stato del proprio stato nel proprio stato.

spero che aiuterà

+0

mi confonde per avere più file con lo stesso nome (indice). Il mio combinatore si chiama reducers.js nei riduttori di cartelle ed è impostato come si menziona – chrysillo

4

Se l'oggetto è vuoto.

export default combineReducers({ 

}) 

Questo errore mostrerà.