redux报错:Error: Expected the reducer to be a function.

我特意在store.js中打印了typeof rootReducer,打印结果是函数,但是为什么却报了这个错?

我的store.js:

import { createStore } from 'redux'
import rootReducer from './reducer';
const initialState = {};
console.log(typeof rootReducer)
const store = createStore(
    rootReducer,
    initialState,
    window.devToolsExtension ? window.devToolsExtension : f=>f
);

export default store

我的reducer.js:

import { combineReducers } from 'redux';
import { music } from './redux/player.redux';
const rootReducer = combineReducers({
    music
});
export default rootReducer

我的app.js:

import React, { Component } from 'react';
import { Provider } from 'react-redux';
import store from './store'
import Router from './router'
class App extends Component {
  render() {
    const store = store();
    return (
      <Provider store={store}>
          <div className="App">
            <Router></Router>
          </div>
      </Provider>
    );
  }
}

export default App;
阅读 10.3k
4 个回答

谢邀!
首先恭喜您已经解决了该问题!白天忙于nextjs + react + 。。。 重构项目,没来得及看!真是抱歉!该问题其实我们看一下createStore的源码就知道了!

/**
 * createStore
 * @param {reducer} reducer为function,当dispatch一个action时,此函数接收action来更新state
 * @param {preloadState} 初始化State
 * @param {enhancer} enhancer 为function。用来增强store
 * @return {Object} 返回一个包含dispatch和subscribe等函数的对象
 */

export default function createStore(reducer, preloadedState, enhancer) {
    if (typeof preloadedState === 'function' && typeof enhancer === 'undefined') {
        // 如果只传了两个参数,且第二个参数为函数,第二个参数则被当作enhancer
        enhancer = preloadedState
        preloadedState = undefined
    }
  
    if (typeof enhancer !== 'undefined') {
        if (typeof enhancer !== 'function') {
            // 校验enhancer是否为函数,如果不是函数则抛出异常
            throw new Error('Expected the enhancer to be a function.')
        }
        // 如果enhancer存在且为函数,那么则返回如下调用
        return enhancer(createStore)(reducer, preloadedState)
    }

    if (typeof reducer !== 'function') {
        //校验reducer是否为函数
        throw new Error('Expected the reducer to be a function.')
    }
    
    // 省略其他源码部分
    
}

解决了,window.devToolsExtension ? window.devToolsExtension() : f=>f,差了个括号。。。

新手上路,请多包涵

我的是导出时忘记加default了 ,加上就好了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏