【问题标题】:React + Redux-router = Uncaught Error: Expected the reducer to be a functionReact + Redux-router = 未捕获的错误:期望 reducer 是一个函数
【发布时间】:2015-12-05 15:05:05
【问题描述】:

我的代码运行良好,但每当我出现编码错误并出现运行时错误时,我都会遇到烦人的问题。例如,在我的一个 JSX 页面中,我使用 Date() 而不是 new Date(),而不是报告实际错误,我得到了......

Uncaught Error: Expected the reducer to be a function.

我犯的任何错误几乎总是这样显示。它是从createStore.js 报告的,它在我下面的configureStore.jsx 代码中。

有没有一种方法可以让我获得更好的错误报告来帮助我识别真正的问题?非常感谢任何帮助或想法!!!

这是我的设置供参考....

ma​​in.jsx

import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import { ReduxRouter } from 'redux-router';
import configureStore from './store/configureStore'
import routes from './routes';

const rootEl = document.getElementById('app-container');

const store = configureStore();

ReactDOM.render(
    <div>
        <Provider store={store}>
            <ReduxRouter routes={routes} />
        </Provider>
    </div>
    , rootEl
);

configureStore.jsx

import { createHashHistory } from 'history';
import { applyMiddleware, createStore, compose } from 'redux';
import { reduxReactRouter } from 'redux-router';

import thunk from 'redux-thunk';
import promiseMiddleware from 'redux-promise-middleware';

import rootReducer from '../reducers/rootReducer';
import routes from '../routes';

export default function configureStore(initialState = {}) {

    const history = createHashHistory();

    const middlewares = [
        thunk,
        promiseMiddleware({
            promiseTypeSuffixes: ['PENDING','SUCCESS','ERROR']
        })
    ];

    const toolChain = [
        applyMiddleware(...middlewares),
        reduxReactRouter({
            routes,
            history
        })
    ];

    const store = compose(...toolChain)(createStore)(rootReducer, initialState);

    if (module.hot) {
        module.hot.accept('../reducers', () => {
            const nextRootReducer = require('../reducers/rootReducer');
            store.replaceReducer(nextRootReducer);
        });
    }
    return store;
}

rootReducer.jsx

import { combineReducers } from 'redux';
import { routerStateReducer } from 'redux-router';
import siteReducer from './siteReducer';

const rootReducer = combineReducers({
    router: routerStateReducer,
    sites: siteReducer
});
export default rootReducer;

siteReducer.jsx

import {GET_SITES} from '../actions/siteActions';

const defaultState = {
    isPending: null,
    isSuccess: null,
    isError: null,
    error: null,
    data: null
};

export default function siteReducer(state = defaultState, action) {

    switch (action.type) {
        case `${GET_SITES}_PENDING`:
            return {
                ...defaultState,
                isPending: true
            };
        case `${GET_SITES}_SUCCESS`:
            return {
                ...defaultState,
                isSuccess: true,
                error: false,
                data: action.payload
            };
        case `${GET_SITES}_ERROR`:
            return {
                ...defaultState,
                isError: true,
                error: action.payload
            };
        default:
            return state;
    }
}

【问题讨论】:

  • 我尝试在本地安装所有文件,对我来说似乎工作正常。您是否尝试评论热重载部分?
  • create-react-app 非常擅长报告正确的错误。您可以创建一个新项目,弹出并查看他们在做什么。

标签: javascript reactjs react-router redux


【解决方案1】:

更改以下行:

const nextRootReducer = require('../reducers/rootReducer');

收件人:

const nextRootReducer = require('../reducers/rootReducer').default;

【讨论】:

    【解决方案2】:

    当您想要导出该变量时,请使用 export const variable_name 而不是 const variable_name

    例如:rootReducer.jsx 应该重写为

    import { combineReducers } from 'redux';
    import { routerStateReducer } from 'redux-router';
    import siteReducer from './siteReducer';
    
    export const rootReducer = combineReducers({
    router: routerStateReducer,
    sites: siteReducer
    });
    export default rootReducer;
    

    注意使用 const rootReducer 的额外导出说明符

    【讨论】:

    • 为什么还要将其导出为命名导出?这并不能解决任何问题
    • 这只会改变您以后导入减速器的方式。请注意,在商店创建过程中,OP 如何使用未命名的导入(即默认值)导入 rootReducer。不幸的是,添加命名导出并不能解决任何问题。
    • 如果它对你有用,也许你正在通过 import { rootReducer } from './rootReducer' 导入你的 rootReducer?
    • 是的,就是这样。
    【解决方案3】:

    我的问题是从根减速器路径导入 Store,而不是从实际捆绑的存储根路径(窗口上的 devtools 和根减速器、中间件正在组合等)。

    import Store from '../../../src/state/Store/reducer';

    改为

    import Store from '../../../src/state/Store';

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-18
      • 1970-01-01
      • 2016-07-22
      • 2018-11-20
      • 1970-01-01
      • 1970-01-01
      • 2017-08-24
      相关资源
      最近更新 更多