【问题标题】:Uncaught TypeError: Super expression must either be null or a function [duplicate]未捕获的TypeError:超级表达式必须为null或函数[重复]
【发布时间】:2018-01-18 15:53:22
【问题描述】:

所以我是 React 的新手,即使我发现多个其他人有同样的问题,我仍然没有在我的代码中发现错误。因此我求助于你 stackoverflow,你是我唯一的希望!

我正在学习,所以我想创建一个简单的 ReactJS 应用程序来处理 HTTP 请求。完成代码后我遇到了错误:

Uncaught TypeError: Super expression must either be null or a function, not object at exports.default (inherits.js?0578:21) at eval (app.js?71f7:22)

即使我尝试了很多不同的更改,错误仍然存​​在,并且我相当肯定它与导入/导出有关,因为这是许多其他消息来源告诉我的,尽管仔细检查导入等并没有t 产生了任何结果。

代码:

app.js(处理简单按钮的呈现,并应在点击时执行简单的 GET 请求)

import React, { Component } from 'react'

import { connect } from 'react-redux' 
import { createServerSagaRequest } from '../saga/serverSaga'
import { incrRequestAmount, requestSelector } from '../reducer/requestReducer'


const mapStateToProps = (state) => {
  return {
    getRequestAmount: requestSelector.requests(state),
  }
}

const mapDispatchToProps = (dispatch) => {
  return {
    open: (url, data, action, method) => dispatch(createServerSagaRequest((url, data, action, method))),
    requests: () => dispatch(incrRequestAmount()),
  }
}


class App extends React {

  constructor(props){
    super(props)
  }

  _buttonClick() {
    this.props.requests()
    this.props.open("http://mvctestproject.local/GetData", "TestDataFraGet", action, "GET")  
  }

  render(){    
    return (
      <button
      className="btn btn-default"
      onClick={this._buttonClick()}>{this.props.getRequestAmount()}
      </button>
    )
  }
}

export default connect(mapStateToProps, mapDispatchToProps)(App)

serverSaga.js(我的可以访问reducer和服务的saga)

import React, { Component } from 'react'
import { put, call, take, fork, select } from 'redux-saga/effects'
import { callServer } from '../service/serverService'
import { incrRequestAmount, requestSelector } from '../reducer/requestReducer'

export function createServerSagaRequest() {return { type: CREATE_REQUEST }}


function* handleRequest(url, data, action, method, success){

  incrRequestAmount()

  return yield executeRequest(url, data, action, method, success)
}


function* executeRequest(url, data, action, method, success) {

    let response = yield call(callServer, url, method, data)
    let responseSuccess = response && response.Succeeded
    return 
}

export default function* serverSaga(){
  yield [
    fork(function*(){
      yield call (CREATE_REQUEST, handleRequest) 
    }),
  ]
}

rootSaga.js(分组 saga - 以防我做更多)

import { fork } from 'redux-saga/effects'

import serverSaga from './serverSaga'

export default function* rootSaga(){
  yield [
    fork(serverSaga)
  ]
}

requestReducer.js(唯一的功能是在每次请求后增加一个变量)

import { fromJS } from 'immutable'


export function incrRequestAmount() {return {type: 'INCR_REQUESTS'}}


const initialState = {
  requestAmount: 0
}

function requestReducer(state = fromJS(initialState), action){
  switch(action.type){
    case 'INCR_REQUESTS':
      return state.updateIn(["requestAmount"], (requests) => requests++)
    default:
      return state
  }
}

export const requestSelector = {
  amount: state => state.requests.get('requestAmount')
}

export default requestReducer

reducers.js(分组reducers - 以防我做得更多)

import { combineReducers } from 'redux'
import React, { Component } from 'react'

import requests from './requestReducer'

export default combineReducers({
  requests,
})

serverService.js(处理对服务器的调用(GET/POST)

import React, { Component } from 'react'

export function callServer(url, bodyData, method){

  let methodType = method.toLowerCase()

  return new Promise((resolve, reject) => {
    let r;
    switch (methodType){
      case 'post':
        r = {
          method: 'POST',
          headers: {
            'Accept': 'application/json',
            'Content-Type': 'application/json',
          },
          body: JSON.stringify(bodyData)
        }
        break;
      case 'get':
        r = {
          method: 'GET'
        }
        break;
    }


    if (r) {

      console.log("URL: ", url)

      fetch(url, r)
        .then((response) => {
          console.log("Resp: ", url, response)
          return response.json()
        })


    }
  })
}

【问题讨论】:

  • 我能看到你使用super的唯一地方是在你的应用程序的构造函数中,它是一个毫无意义的构造函数。如果你只是删除它会发生什么?
  • class App extends React 应该是 class App extends React.Component(或 extends Component,取决于您的导入)

标签: python reactjs ecmascript-6 react-redux redux-saga


【解决方案1】:

您需要扩展React.Component 来创建组件,而不是React 本身:

class App extends React {

应该是

class App extends React.Component {

,或者既然你直接导入了Component

class App extends Component {

【讨论】:

    猜你喜欢
    • 2021-06-11
    • 2017-11-05
    • 1970-01-01
    • 2021-10-20
    • 2023-04-10
    • 2016-05-05
    • 1970-01-01
    • 2018-02-01
    • 2020-05-31
    相关资源
    最近更新 更多