reactjs给出错误Uncaught TypeError:超级expression式必须为null或函数,而不是未定义的
我正在使用reactjs。
当我在浏览器下面运行代码时说:
Uncaught TypeError:超级expression式必须为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>; } }
更新:在这个问题上在地狱火燃烧三天后,我发现我没有使用最新版本的反应。
全局安装:
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版本。 请参阅下面的答案以获取有关要从中延伸的类的更多信息。
升级反应
自0.13.0版本以来,React只支持ES6风格的类(请参阅其官方博客上的支持介绍。
在此之前,使用时:
class HelloMessage extends React.Component
您试图使用ES6关键字( extends
)来从没有使用ES6 class
定义的类进行子class
。 这可能就是为什么你用super
定义的方式遇到奇怪的行为
所以,是的, TL; DR – 更新到React v0.13.x.
循环依赖
如果您有循环导入结构,也会发生这种情况。 一个模块导入另一个,反过来。 在这种情况下,你只需要重构你的代码,以避免它。 更多信息
这意味着你想要子类的东西,应该是Class
,但是undefined
。 原因可能是:
-
Class extends ...
,所以你扩展未定义的variables - 在
import ... from
,所以你从模块导入undefined
- 引用的模块不包含值,你想导入(例如,过时的模块 – 与React的情况下),所以你导入不存在的价值(
undefined
) - 在引用的模块
export ...
语句中input错误,所以它导出未定义的variables - 所引用的模块完全缺less
export
语句,所以它的输出只是undefined
它也可能是由于input错误造成的,所以不是使用大写C的Component
,而是使用较低的c component
,例如:
React.component //wrong. React.Component //correct.
在我的情况下,与反应本土,错误是我有
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';
我错过了JSX类的导出语句时遇到过这种情况。
例如:
class MyComponent extends React.Component { } export default MyComponent // <- add me
对于任何其他人,这可能会发展这个问题。 您也可以检查React.Component
中的component
方法是否大写。 我有同样的问题,是什么原因导致我写道:
class Main extends React.component { //class definition }
我改变了
class Main extends React.Component { //class definition }
一切运作良好
如果您试图在类定义中使用错误的()
执行React.Component
,您也可以收到此React.Component
。
export default class MyComponent extends React.Component() {} ^^ REMOVE
当我从一个无状态的function组件转换到一个类时,我有时可以做到这一点。
我有看到这个错误,当你有一个循环依赖。
class A extends B {} class B extends C {} class C extends A {}
当我在导入时遇到错字时,我得到了这个:
import {Comonent} from 'react';
检查你扩展的类实际上是否存在,很lessReact方法被折旧,也可能是一个Typo错误'React.Components'
而不是'React.Component'
祝你好运!!
我有同样的问题,只需从Navigator
到{Navigator}
import Navigator from 'react-native-deprecated-custom-components' // to import {Navigator} from 'react-native-deprecated-custom-components'
我将提供另一个可能的解决scheme,一个为我工作的解决scheme。 我正在使用便利索引来收集所有组件到一个文件。
我不相信在撰写本文的时候,这是由babel正式支持的,并且把打字稿打成一个旋转 – 但是我已经看到它在很多项目中使用,绝对方便。
但是,当与inheritance结合使用时,似乎会抛出上述问题中提出的错误。
一个简单的解决scheme是,作为父母的模块需要直接导入,而不是通过便利的索引文件。
./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 { }
我的问题是我没有导出文件末尾的类…
使用Babel(5.8)我得到相同的错误,如果我尝试使用expression式export default
与其他export
结合使用:
export const foo = "foo" export const bar = "bar" export default function baz() {}
我写了
React.component
而不是React.Component
这是我的问题)),并正在寻找这个半小时以上。
如果你收到这个错误,正在使用Browserify和browserify -shim (就像在一个Grunt任务中一样),你可能会经历一个愚蠢的时刻,就像我无意中告诉browserify-shim
把React当作已经是全局命名空间的一部分例如,从CDN加载)。
如果您希望Browserify将React作为转换的一部分,而不是单独的文件,请确保"react": "global:React"
不出现在packages.json
文件的"browserify-shim"
部分。
如果您在代码中使用require
而不是import
,也会发生这种情况。
当我使用这个时,也发生在我身上:
class App extends React.Component(){ }
而不是正确的一个:
class App extends React.Component{ }
注意: – ()第一个是这个问题的主要原因
如果您有recursion导入,也会发生这种情况。
即ComponentA需要ComponentB,而ComponentB需要ComponentA。
这个答案不正确,但对于其他人有相同的错误我可笑的愚蠢的错误可能会有所帮助。
愚蠢的是,我的问题是通过 include ()跟在类名后面使用函数符号 。
确保你的语法是正确的。 而且您已经导入并导出了具有正确名称和path的任何外部组件/模块。
如果您安装了新版本的反应,此模板应该可以正常工作:
import React, { Component } from 'react' class ExampleClass extends Component { render(){ return( <div> </div> ) } } export default ExampleClass
在我的情况下,我写
类名扩展React.Compoment //而不是类名扩展React.Component