React + Redux - 未捕获错误:期望reducer成为一个函数

Mat*_*att 18 javascript reactjs redux

我尝试了简单的react,redux,ajax工作示例并遵循Reddit API教程,但我无法创建存储并获取错误:

Uncaught Error: Expected the reducer to be a function.
Run Code Online (Sandbox Code Playgroud)

index.jsx

...

import { createStore, applyMiddleware } from 'redux'
var thunkMiddleware = require('redux-thunk');
var createLogger = require('redux-logger');
var rootReducer = require('./reducers.js');

        const loggerMiddleware = createLogger();

        function configureStore(initialState) {
            return createStore(
                rootReducer,
                initialState,
                applyMiddleware(
                    thunkMiddleware,
                    loggerMiddleware
                )
            )
        }

        const store = configureStore();
Run Code Online (Sandbox Code Playgroud)

...

rootReducer.js

import { combineReducers } from 'redux';

function products(state = {
    isFetching: false,
    didInvalidate: false,
    items: []
}, action) {
    switch (action.type) {
        case 'REQUEST_PRODUCTS':
            return Object.assign({}, state, {
                isFetching: true,
                didInvalidate: false
            })
        case 'RECEIVE_PRODUCTS':
            return Object.assign({}, state, {
                isFetching: false,
                didInvalidate: false,
                items: action.posts,
                lastUpdated: action.receivedAt
            })
        default:
            return state
    }
}

function specialPosts(state = { }, action) {
    switch (action.type) {
        case RECEIVE_SPECPOSTS:
        case REQUEST_SPECPOSTS:
            return Object.assign({}, state, {
                req: true
            })
        default:
            return state
    }
}

const rootReducer = combineReducers({
    products,
    specialPosts
});

export default rootReducer;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

rootReducer的类型是对象,但为什么呢?我应该改变createStore功能rootReducer.default吗?

return createStore(
    rootReducer.default,
    initialState,
    applyMiddleware(
        thunkMiddleware,
        loggerMiddleware
     )
)
Run Code Online (Sandbox Code Playgroud)

的package.json

"redux-logger": "^2.6.1",
"react-redux": "^4.4.1",
"react-redux-provide": "^5.2.3",
"redux": "^3.3.1",
"redux-thunk": "^2.0.1",
Run Code Online (Sandbox Code Playgroud)

Tom*_*Tom 9

const rootReducer = combineReducers({
    products,
    specialPosts
});

const store = createStore( rootReducer, applyMiddleware( thunkMiddleware ));
Run Code Online (Sandbox Code Playgroud)

然后根据各个化简函数返回的初始状态自动创建初始状态。这些单独的状态可以通过state.products和访问state.specialPosts

  • 也许添加您所做的更改的解释? (10认同)
  • 您可能需要添加更多说明,以使其他寻求类似解决方案的人说得通。 (2认同)

Mik*_*ert 8

问题是由于rootReducer被"require"导入(ES5):

var rootReducer = require('./reducers.js');
Run Code Online (Sandbox Code Playgroud)

如果您通过ES6方法导入它,它将正确地将rootReducer.js的默认值自动保存到rootReducer中:

import rootReducer from './reducers';
Run Code Online (Sandbox Code Playgroud)

我看到你在那个文件中混合了ES5(require)和ES6(import)......我也在混合我的项目,这就是我遇到这个问题的原因.更多信息可以在这里找到:https://medium.com/@kentcdodds/misunderstanding-es6-modules-upgrading-babel-tears-and-a-solution-ad2d5ab93ce0#.2x2p2dx3m


KAR*_*N.A 6

创建 store 时,第一个参数必须是函数,这意味着 reduce( ()=>[]) 参数

错误:

import {createStore,applyMiddleware} from 'redux';


export default function configureStore(initialState) {
  return createStore(
    [],
    {},
    applyMiddleware()
  );
}
Run Code Online (Sandbox Code Playgroud)

解决方案:

import {createStore,applyMiddleware} from 'redux';


export default function configureStore(initialState) {
  return createStore(
    ()=>[],
    {},
    applyMiddleware()
  );
}
Run Code Online (Sandbox Code Playgroud)