reactjs提供错误Uncaught TypeError:超级表达式必须为null或函数,且未定义


256

我正在使用reactjs。

当我运行下面的代码时,浏览器显示:

未捕获的TypeError:超级表达式必须为null或函数,且未定义

关于任何错误的任何暗示将不胜感激。

首先是用于编译代码的行:

browserify -t reactify -t babelify examples/temp.jsx  -o examples/public/app.js

和代码:

var React = require('react');

class HelloMessage extends React.Component {
  render() {
    return <div>Hello </div>;
  }
}

更新:在针对此问题的地狱之火中燃烧了三天后,我发现我没有使用最新版本的react。

全局安装:

sudo npm install -g react@0.13.2

在本地安装:

npm install react@0.13.2

确保浏览器也使用正确的版本:

<script type="text/javascript" src="react-0.13.2.js"></script>

希望这可以为他人节省三天的宝贵生命。


111
从0.14.8开始,如果执行类似extends React.component(lowercase c)的操作,仍然可以得到此代码。
凯文·索特尔

12
@Kevin只是想改一下,基本上,如果您在某处有错字,就我而言,它Components不是Component :)。您的评论帮助BTW
P-RAD

我的问题是我没有在文件末尾导出类……
R01010010

2
我做了React.Components(复数),右边是React.Component(单数)太好了……我怎么想念那个……
Ismael

5
@Kevin Suttle您的评论实际上比答案更有用
Mick Jones

Answers:


325

类名

首先,如果确定要从正确命名的类扩展,例如React.Component,而不是React.component或React.createComponent,则可能需要升级React版本。有关扩展类的更多信息,请参见下面的答案。

升级React

从0.13.0版本开始,React仅支持ES6样式的类(请参阅此处的官方博客,以了解支持简介。

在此之前,使用时:

class HelloMessage extends React.Component

您试图使用ES6关键字(extends)继承未使用ES6定义的类class。这可能是为什么您在super定义等方面遇到奇怪行为的原因。

所以,是的,TL; DR-更新到Reactv0.13.x。

循环依赖

如果您具有循环导入结构,也会发生这种情况。一个模块导入另一个模块,反之亦然。在这种情况下,您只需要重构代码即可避免这种情况。更多信息


202
对于其他所有遇到此问题但更新React的人来说,解决方案都不是解决之道-向下滚动到其他答案,这可能是一个简单的错字。在我的情况下,它是使用React.component而不是的类定义React.Component
Christian Benke,2016年

1
仅供参考,也可以使用扩展旧方法类extends。试试看 var x = function(){}; class y extends x {}
Mouneer '16

2
对我来说,这是一个循环的进口结构。感谢您为我节省了大量的调试时间!
DrunkDevKek '17

4
仅供参考。我最近在ReactJS 16.x上遇到了同样的错误。原来我在这行中有错别字:class App extends React.Component () {...}-应该改正为class App extends React.Component {...}()末尾没有)
Atlas7

1
大写的“ C”部分!#facepalm
David

127

这意味着您想要子类化某些东西,应该是Class,但是是undefined。原因可能是:

  • 中的错字Class extends ...,因此您扩展了未定义的变量
  • 输入错误import ... from,因此您undefined要从模块导入
  • 引用的模块不包含您要导入的值(例如,过时的模块-使用React的情况),因此您导入不存在的值(undefined
  • 引用模块export ...语句中的错字,因此它会导出未定义的变量
  • 引用的模块完全缺少export语句,因此仅导出undefined

23
就我而言,它是React.Component中Component的小写字母。
例如,通过

3
就我而言,这是一个未正确导入的自写类。我通过import {Foo} from 'bar'而不是导入了默认的导出类import Foo from 'bar'。因此支持。
xtra

4
也不要这样做:class Thing extends React.Component() {-我必须删除()
activedecay

在我的情况下,此错误是由组件渲染函数中导入的内容(我想扩展到子类的类)意外创建循环引用引起的。当我尝试执行/渲染子类时,因为尚未创建超类,但尚未定义。
Leon

^也是由我的循环引用引起的。
凯伦

90

它也可能是由于输入错误而引起的,因此Component您要component使用较低的c 来代替大写C,例如:

React.component //wrong.
React.Component //correct.

注意: 导致此错误的原因可能是因为存在React,我们认为接下来自动出现的应该是一个以小写字母开头的react方法或属性,但实际上是另一个ClassComponent)应该以一个大写字母开头。


2
呵呵,奇怪的是,在webpack构建步骤中未捕获到此错误,但是它将在运行时显示。
worc

31

就我而言,使用react-native,错误是我有

import React, {
  AppRegistry,
  Component,
  Text,
  View,
  TouchableHighlight
} from 'react-native';

代替

import React, { Component } from 'react';
import {
  AppRegistry,
  StyleSheet,
  Text,
  View,
  Image,
  AsyncStorage
} from 'react-native';

2
就我而言,这有效!react-native网站提供的文档中有这个错误的示例:)
通常,

谢谢,组件应该从“反应”中导入
xyz

15

缺少JSX类的导出语句时,我遇到了这种情况。

例如:

class MyComponent extends React.Component {
}
export default MyComponent // <- add me

15

如果您试图在类定义中执行React.Component错误(),也可以收到此消息。

export default class MyComponent extends React.Component() {}
                                                        ^^ REMOVE

从无状态功能组件转换为类时,有时可以做到这一点。


这是我的问题。很傻 非常感谢!
19st

14

当您有循环依赖项时,我已经看到此错误。

class A extends B {}
class B extends C {}
class C extends A {}

10

对于任何其他人,可能会出现此问题。您也可以检查中的component方法React.Component是否大写。我遇到了同样的问题,导致该问题的原因是我写了:

class Main extends React.component {
  //class definition
}

我将其更改为

class Main extends React.Component {
  //class definition
}

一切都很好




4

我将提供另一种可能的解决方案,对我有用。我使用便利索引将所有组件收集到一个文件中。

我不相信在撰写本文时,它会得到babel的正式支持,并且会把打字稿变成混乱-但是,我已经看到它在许多项目中都使用过,而且绝对方便。

但是,当与继承结合使用时,似乎会抛出上述问题中提出的错误。

一个简单的解决方案是,对于充当父模块的模块,需要直接导入,而不是通过便捷索引文件导入。

./src/components/index.js

export Com1 from './com-1/Com1';
export Com2 from './com-2/Com2';
export Com3 from './com-3/Com3';
export Parent1 from './parent/Parent1';

./src/components/com-1/Com1.js

import { Com2, Com3 } from '../index';

// This works fine
class Com1 {        
    render() {
        return (
            <div>
                <Com2 {...things} />
                <Com3 {...things} />
            </div>
        );
    }
}

./src/components/com-3/Com3.js

import { Parent } from '../index';

// This does _not_ work
class Com3 extends Parent {        
}

./src/components/com-3/Com3.js

import Parent from '../parent/Parent';

// This does work
class Com3 extends Parent {        
}

这有助于我弄清楚我做错了什么。在导入语句中的{}中意外包装了组件名称。细微的差别。可能很难发现该错误。
丹尼斯W

4

这为我工作:

import React, {Component} from 'react';

4

Webpack 4块化和哈希化,通过TerserPlugin进行丑化

当Webpack通过TerserPlugin(当前版本1.2.3)使用带有最小化和非统一化的块和哈希时,可能会发生这种情况。在我的情况下,错误被缩小到我的vendors.[contenthash].js捆绑包的Terser插件的丑陋程度node_modules。不使用哈希时,一切正常。

解决方案是在丑化选项中排除捆绑销售商品:

optimization: {
  minimizer: [
    new TerserPlugin({
      chunkFilter: (chunk) => {
        // Exclude uglification for the `vendors` chunk
        if (chunk.name === 'vendors') {
          return false;
        }
        return true;
      },
    }),
  ],
}

更多信息


这确实为我解决了问题,但是我能够指出罪魁祸首,因此最终我可以进行丑化。看看我的回答-令人眼花react乱。
Erez Cohen

我缩小到terser插件,最终将react-script更改为版本3.2.0,为我解决了该问题。
avck

3

我有同样的问题,只是从更改Navigator{Navigator}

import Navigator from 'react-native-deprecated-custom-components'
// to
import {Navigator} from 'react-native-deprecated-custom-components'

1
基本上应该这样匹配: export Foo ... import { Foo } -或 export default Foo ... import Foo
dpren

3

这个答案不正确,但是对于其他具有相同错误的人,我可笑的愚蠢错误可能会有所帮助。

愚蠢的是,我的问题是通过在类名后面包含()来使用函数表示法

确保您的语法正确。并且您已经导入和导出了具有正确名称和路径的所有外部组件/模块。

如果您安装了最新版本的react,则此模板应该可以正常工作:

import React, { Component } from 'react'

class ExampleClass extends Component {

    render(){
        return(
            <div>

            </div>
        )
    }
}

export default ExampleClass 

3

我的条件

  • 创建反应应用
  • 反应脚本v3.2
  • Froala富文本编辑器v3.1
  • 开发模式效果很好
  • 生产版本因问题中提到的错误而中断

解决我的问题

将Froala降级到v3.0。

v3.1中的某个内容破坏了我们的Create React App构建过程。

更新:使用React脚本v3.3

我们发现React脚本3.2和Froala 3.1之间存在问题。

通过更新到React Scripts v3.3,我们可以升级到Froala 3.1。


1
我爱你。我想来找你,吻你的脚!(噩梦通宵)
GaddMaster

我没有使用create react app,但是在froala 3.1的产品上也遇到了同样的问题。您能解释一下这里的问题吗?
Karan Jariwala

2

我写过

React.component

而不是React.Component 那是我的问题)),并一直在寻找超过半小时的时间。


2

就我而言,我正在使用:

class Root extends React.Component() {
// THIS IS WORNG
// After React.Component () <- WRONG!!
}

这是错误的,但正确的是:

class Root extends React.Component {
// THIS IS CORRECT
// That -> '()' after React.Component was typo
}

也确保有
React.Component

ˣ React.componentReact.Components


欢迎来到SO。显然OP并未犯此错误,因为他们已经在问题中包含了正确的表格。您是否遇到与OP相同的错误,但原因不同?
Eduardo

是的,我得到的错误与OP相同,但是我发现原因不同,希望这对其他人有帮助。
库什高塔姆

2

可能有第三方软件包导致此情况。在我们的例子中,这是令人反感的。我们的设置与@steine相似(请参见上面的答案))。

为了找到有问题的软件包,我以生产模式在本地运行了webpack构建,因此能够在堆栈跟踪中找到有问题的软件包。因此,为我们提供了解决方案,而我得以保持丑陋的状态。


1

使用Babel(5.8)如果尝试将表达式export default与其他一些表达式结合使用,则会遇到相同的错误export

export const foo = "foo"
export const bar = "bar"
export default function baz() {}


1

就我而言,我通过将更export default class yourComponent extends React.Component() {}改为解决了该错误export default class yourComponent extends React.Component {}。是的,删除括号可以()解决该错误。



1

看看您在输入或生成类时是否有错字错误,可能就是这样。


1

更改import React from 'react-domimport React, {Component} from 'react'
而变化class Classname extends React.Component,以class Classname extends Component
如果您使用的是最新版本的阵营(16.8.6截至目前)


0

如果您收到此错误,并且正在使用Browserifybrowserify -shim(例如在Grunt任务中),您可能会遇到一个愚蠢的时刻,就像我所做的那样,您无意间被告知browserify-shim将React视为全局名称空间的一部分(例如,从CDN加载)。

如果您希望Browserify将React作为转换的一部分而不是单独的文件,请确保该行"react": "global:React"未出现在文件的"browserify-shim"部分中packages.json


Uncaught Error: Cannot find module 'react'删除browserify-shim配置后如何避免?基本上,我想将react作为外部依赖项保留,但是browserify似乎不了解如何构建包并将React保持在外部。这可能是,也可能不是,因为我在我的browserify入口点中包含的模块已作为依赖项做出反应。
dmarr '16

FWIW,从browserify-shim配置中删除响应并让browserify协调依赖关系通常仍会导致OP的问题。
dmarr '16

0

如果您使用require而不是import在代码中,也会发生这种情况。


0

当我使用这个时也发生在我身上:

class App extends React.Component(){

}

而不是正确的:

class App extends React.Component{

}

注意:-()在第一个中是导致此问题的主要原因


0

对于那些使用react-native

import React, {
  Component,
  StyleSheet,
} from 'react-native';

可能会产生此错误。

react直接引用是更稳定的方法:

import React, { Component } from 'react';
import { StyleSheet } from 'react-native';

0

就我而言,正是React.Element更改为React.Component才解决了该错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.