• 3.4k

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;
阅读 3.8k
评论
    3 个回答
    • 8.4k

    谢邀!
    首先恭喜您已经解决了该问题!白天忙于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.')
        }
        
        // 省略其他源码部分
        
    }
      • 3.4k

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

        • 113

        作者你咋解决,我能说我都没看懂你们说什么

          撰写回答

          登录后参与交流、获取后续更新提醒

          相似问题
          推荐文章