我正在使用ReactJS。

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

Uncaught TypeError:超级表达式必须为null或函数,不能为undefined

任何关于哪里出了问题的提示都会让我感激不尽。

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

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>

希望这能挽救别人三天宝贵的生命。


当前回答

类名

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

升级的反应

React从0.13.0版本开始只支持es6风格的类(请参阅他们的官方博客中关于支持介绍的文章)。

在此之前,使用时:

class HelloMessage extends React.Component

你试图使用ES6关键字(扩展)从一个没有使用ES6类定义的类的子类。这可能就是为什么你会遇到一些带有超定义的奇怪行为。

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

循环依赖

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

其他回答

我也有同样的问题因为"反应时刻"

将其替换为'moment'库

我在导入组件时遇到了这个错误,比如:

import React, { Components } from 'react';

而不是

import React, { Component } from 'react';

这意味着你想要子类化一些东西,它应该是Class,但没有定义。原因可能是:

类扩展中的拼写错误…,所以你扩展了一个未定义的变量 输入错误…从,所以你导入了undefined From模块 引用的模块不包含该值,你想导入(例如,过时的模块-情况与React),所以你导入不存在的值(未定义) 引用模块导出时出现错误…语句,因此它导出未定义的变量 引用的模块完全没有导出语句,所以它导出的是未定义的

类名

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

升级的反应

React从0.13.0版本开始只支持es6风格的类(请参阅他们的官方博客中关于支持介绍的文章)。

在此之前,使用时:

class HelloMessage extends React.Component

你试图使用ES6关键字(扩展)从一个没有使用ES6类定义的类的子类。这可能就是为什么你会遇到一些带有超定义的奇怪行为。

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

循环依赖

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

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

我不相信在写这篇文章的时候,babel是官方支持的,并且会把typescript弄得一团糟——但是我在很多项目中看到过它的使用,而且肯定很方便。

然而,当与继承结合使用时,它似乎会抛出上面问题中提出的错误。

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

. / src /组件/ 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 /组件/ com-1 / Com1.js

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

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

. / src /组件/ com-3 / Com3.js

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

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

. / src /组件/ com-3 / Com3.js

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

// This does work
class Com3 extends Parent {        
}