【问题标题】:Uncaught TypeError: Object(...) is not a function at connectUncaught TypeError: Object(...) is not a function at connect
【发布时间】:2021-02-28 03:20:25
【问题描述】:

我在 Udemy 上学习 React 课程,在 Redux 部分我遇到了这个错误Uncaught TypeError: Object(...) is not a function at connect。我试图谷歌它,但仍然没有找到解决方案。 有人可以帮我吗?非常感谢。

Counter.js

import React, { Component } from 'react';
import { connect } from 'react-redux';

import CounterControl from '../../components/CounterControl/CounterControl';
import CounterOutput from '../../components/CounterOutput/CounterOutput';

class Counter extends Component {
 state = {
     counter: 0
 }

counterChangedHandler = (action, value) => {
    switch (action) {
        case 'inc':
            this.setState((prevState) => { return { counter: prevState.counter + 1 } })
            break;
        case 'dec':
            this.setState((prevState) => { return { counter: prevState.counter - 1 } })
            break;
        case 'add':
            this.setState((prevState) => { return { counter: prevState.counter + value } })
            break;
        case 'sub':
            this.setState((prevState) => { return { counter: prevState.counter - value } })
            break;
    }
}

render() {
    return (
        <div>
            <CounterOutput value={this.props.ctr} />
            <CounterControl label="Increment" clicked={() => this.counterChangedHandler('inc')} />
            <CounterControl label="Decrement" clicked={() => this.counterChangedHandler('dec')} />
            <CounterControl label="Add 5" clicked={() => this.counterChangedHandler('add', 5)} />
            <CounterControl label="Subtract 5" clicked={() => this.counterChangedHandler('sub', 5)} />
        </div>
    );
 }
}

const mapStateToProps = state => {
   return {
       ctr: state.counter
   }
 };

export default connect(mapStateToProps)(Counter);

包.json

 {
  "name": "react-complete-guide",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "react": "^17.0.1",
    "react-dom": "^16.14.0",
    "react-redux": "^7.2.2",
    "react-scripts": "1.0.13",
    "redux": "^4.0.5"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject"
  }
}

索引.js

import React from 'react';
import ReactDOM from 'react-dom';
import { createStore } from 'redux';
import { Provider } from 'react-redux';

import './index.css';
import App from './App';
import registerServiceWorker from './registerServiceWorker';
import reducer from './store/reducer';

const store = createStore(reducer);

ReactDOM.render(<Provider store={store}><App /></Provider>, document.getElementById('root'));
registerServiceWorker();

reducer.js

const initialState = {
  counter: 0
};

const reducer = (state = initialState, action) => {
  return state;
};

export default reducer;

..................

【问题讨论】:

    标签: javascript react-redux


    【解决方案1】:

    我一直在学习相同的课程并面临相同的问题。最后都是关于 React、Redux 和 react-redux 库的版本。因为看起来课程不是最新的并且使用的是 16.0.0 版本的 React。 帮助我并使我的项目成功构建的一件事是使用来自redux--assignment-2-problem 项目的package.json 文件(这是课程第 14 节中给出的源代码的项目) 于是我复制了下面的package.json,粘贴到项目的根文件夹中:

    {
      "name": "react-complete-guide",
      "version": "0.1.0",
      "private": true,
      "dependencies": {
        "react": "^16.0.0",
        "react-dom": "^16.0.0",
        "react-redux": "^5.0.6",
        "react-scripts": "1.0.13",
        "redux": "^3.7.2"
      },
      "scripts": {
        "start": "react-scripts start",
        "build": "react-scripts build",
        "test": "react-scripts test --env=jsdom",
        "eject": "react-scripts eject"
      }
    }
    

    然后我用那个包配置运行npm install,一切顺利。

    【讨论】:

    • 对我来说也是同样的解决方案
    • 嗨 Anton,您是否遇到过与“redux--assignment-2-problem”相同的问题? package.json 似乎无法使用它
    • 嘿!尝试删除“node_modules”文件夹和“package-lock.json”文件,然后再次在项目上运行“npm install”,看看它是否有效
    • 嘿@DuyLong 你在构建这个项目时运气好吗?如果它解决了问题,你能将答案标记为正确(或至少有用)吗?
    • 我做到了@Anton
    【解决方案2】:

    reducer.js 中导出之前,您可能需要调用combineReducers

    import { combineReducers } from 'redux';
    const initialState = {
      counter: 0
    };
    
    const reducer = (state = initialState, action) => {
      return state;
    };
    
    export default combineReducers({counter: reducer});
    

    counter.js 也需要更新:

    const mapStateToProps = state => {
       return {
           ctr: state.counter.counter
       }
     };
    

    此外,从设计的角度来看,将计数作为整数而不是对象存储在 reducer 中更有意义。

    【讨论】:

    • 我对原始答案进行了一些编辑。您是否遇到同样的错误?
    • 这很有趣。你在这门课上走了多远?我还注意到没有 action creators,这意味着 redux 商店没有更新。
    • 我确实从课程中克隆了这个项目并且它有效。我在 package.json 文件中发现 react、react-redux、redux 的版本比我的版本旧。可能就是这个问题。
    • 可能就是这样。安装这些模块的更新版本可能是个好主意。
    相关资源