私は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>;
}
}
更新:この問題について3日間地獄で燃えた後、私はreactの最新版を使用していないことがわかりました。
グローバルにインストールします。
Sudo npm install -g [email protected]
ローカルにインストールします。
npm install [email protected]
ブラウザも正しいバージョンを使用していることを確認してください:
<script type="text/javascript" src="react-0.13.2.js"></script>
これが他の誰かに3日間の貴重な命を救うことを願っています。
クラス名
まず、正しい名前のクラスから拡張していることが確実な場合は、 React.componentやReact.createComponentではなく、React.Componentを使用する場合は、Reactのバージョンをアップグレードする必要があります。拡張するクラスの詳細については、以下の回答を参照してください。
アップグレードの反応
Reactはバージョン0.13.0以降のES6スタイルのクラスしかサポートしていません(サポート紹介 here の公式ブログ記事を参照)。
その前に、使用するとき:
class HelloMessage extends React.Component
eS6のextends
で定義されていないクラスからサブクラス化するためにES6のキーワード(class
)を使用しようとしました。これがsuper
の定義などで奇妙な振る舞いをしていた理由です。
そう、はい、TL; DR - React v0.13.xに更新してください。
循環依存関係
循環インポート構造がある場合にも発生する可能性があります。あるモジュールが別のモジュールをインポートし、その逆になっている。この場合は、それを避けるためにコードをリファクタリングするだけです。 詳細情報
これは、サブクラスの何かが必要であることを意味します。それはClass
であるべきですが、undefined
です。理由は次のとおりです。
Class extends ...
のタイプミスなので、未定義の変数を拡張するimport ... from
にタイプミスがあるので、モジュールからundefined
をインポートします。undefined
)export ...
ステートメントに誤植があるので、未定義の変数をエクスポートします。export
ステートメントをまったく持っていないので、undefined
だけをエクスポートします。タイプミスエラーも原因である可能性があるので、大文字のCを持つComponent
の代わりに、より低いcのcomponent
を使用します。次に例を示します。
React.component //wrong.
React.Component //correct.
注: このエラーの原因はReact
があり、次に来るのは自動的に小文字で始まる反応のあるメソッドまたはプロパティであるべきだと思うかもしれませんが、実際は別のものです Class (Component
)これは大文字で始まります。
私の場合は、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';
JSXクラスのエクスポートステートメントが欠落しているときにこれを経験しました。
例えば:
class MyComponent extends React.Component {
}
export default MyComponent // <- add me
循環的な依存関係がある場合、私はこのエラーを見ました。
class A extends B {}
class B extends C {}
class C extends A {}
クラス定義でReact.Component
を誤った()
で実行しようとしている場合にもこれを受け取ることができます。
export default class MyComponent extends React.Component() {}
^^ REMOVE
ステートレスな機能的なコンポーネントからクラスに変換するとき、私は時々することができます。
他の人にとっては、この問題が発生する可能性があります。 React.Component
のcomponent
メソッドが大文字になっていることも確認できます。私は同じ問題を抱えていて、それを引き起こしたのは私が書いたことです:
class Main extends React.component {
//class definition
}
に変更しました
class Main extends React.Component {
//class definition
}
そしてすべてがうまくいった
私は私のインポートにタイプミスがあったときに私はこれを得ました:
import {Comonent} from 'react';
あなたが実際に拡張しているクラスをチェックし、いくつかのReactメソッドが非推奨になりました。それはまた、'React.Components'
ではなく'React.Component'
というタイプミスエラーかもしれません。
がんばろう!!
私は別の可能な解決策、私のために働いたものに貢献するつもりです。私はコンビニエンスインデックスを使ってすべてのコンポーネントを1つのファイルに集めていました。
この記事を書いている時点では、これがbabelによって公式にサポートされているとは思われず、TypeScriptを使い始めました。
ただし、継承と組み合わせて使用すると、上記の質問で示されているエラーが発生するようです。
簡単な解決策は、親として機能するモジュールを、便利なインデックスファイルではなく直接インポートする必要があるということです。
./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 {
}
これは私のために働いた:
import React, {Component} from 'react';
私は同じ問題を抱えています、Navigator
から{Navigator}
に変更するだけです。
import Navigator from 'react-native-deprecated-custom-components'
// to
import {Navigator} from 'react-native-deprecated-custom-components'
これを引き起こすサードパーティのパッケージがあるかもしれません。私たちの場合は react-dazzle でした。 @steineと似た設定があります( 上記の回答を参照してください )。
問題のあるパッケージを見つけるために、私はwebpackビルドをプロダクションモードでローカルに走らせました、そしてそれ故スタックトレースの中で問題のあるパッケージを見つけることができました。だから私たちのために これ 解決策を提供し、私は醜化を続けることができました。
私は書いた
React.component
React.Component
の代わりにそれが私の問題でした))そして30分以上これを探していました。
TerserPluginによる醜化を伴うWebpack 4チャンクおよびハッシュ
これは、WebpackがTerserPlugin(現在のバージョン1.2.3)を介して、チャンクとハッシュを使用して縮小と非分割を行う場合に発生する可能性があります。私の場合、エラーは私のvendors.[contenthash].js
を保持している私のnode_modules
バンドルのTerserプラグインによる醜化に絞り込まれました。ハッシュを使わないときはすべてうまくいきました。
解決策は、アグリゲーションオプションでバンドルを除外することでした。
optimization: {
minimizer: [
new TerserPlugin({
chunkFilter: (chunk) => {
// Exclude uglification for the `vendors` chunk
if (chunk.name === 'vendors') {
return false;
}
return true;
},
}),
],
}
この答えには正しくありませんが、同じエラーを持つ他の人にとっては私のばかげて愚かな間違いが潜在的に助けることができるでしょう。
愚かにも、私の問題は クラス名の後に()を含めることによって関数表記を使用することでした 。
構文が正しいことを確認してください。そして、あなたは正しい名前とパスでどんな外部のコンポーネント/モジュールでもインポートして、エクスポートしました。
最新バージョンのreactがインストールされている場合、このテンプレートは問題なく機能します。
import React, { Component } from 'react'
class ExampleClass extends Component {
render(){
return(
<div>
</div>
)
}
}
export default ExampleClass
私の場合は、export default class yourComponent extends React.Component() {}
をexport default class yourComponent extends React.Component {}
に変更してこのエラーを修正しました。はい括弧を削除してください()
はエラーを修正しました。
インポートまたはクラス生成にタイプミスがあるかどうかを確認してください。それは単純なことかもしれません。
import React from 'react-dom
をimport React, {Component} from 'react'
に変更
そしてclass Classname extends React.Component
をclass Classname extends Component
に変更してください
最新版の React(現在の16.8.6)を使用している場合 。
Babel(5.8)の使用式export default
を他のexport
と組み合わせて使用しようとすると、同じエラーになります。
export const foo = "foo"
export const bar = "bar"
export default function baz() {}
次のようなコンポーネントをインポート中にこのエラーが発生しました。
import React, { Components } from 'react';
の代わりに
import React, { Component } from 'react';
これが一つの答えです。
import React, { Component } from 'react'; // NOT 'react-dom'
私の場合、私は使っていました:
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
NOTReact.component
またはReact.Components
あなたが開発者監視モードを実行している場合は、停止して再構築してください。私はES6モジュールをReact Componentに変換しました、そしてそれは再構築の後にだけ動作しました(vs build)。
私がこれを使用したときにも私に起こった:
class App extends React.Component(){
}
正しいものの代わりに:
class App extends React.Component{
}
通知: - ()この問題の主な原因である最初のもので
私の場合は、このエラーを修正するのはReact.ElementからReact.Componentに変更したことです。
私の場合は、ピア依存関係を持つnpmモジュールを使用していました。このエラーは、モジュールのwebpack設定内の間違った 'external'設定が原因でした。
externals: {
react: 'react',
react: 'prop-types',
},
そのはず:
externals: {
react: 'react',
['prop-types']: 'prop-types',
},
TypepoでExpo/react-nativeを使用した場合のもう1つの発生:パッケージングの途中でTypeScriptファイルを再コンパイルすると、reactパッケージャが失われることがあります。
アプリを再度実行する唯一の方法は、キャッシュをクリアすることです。あなたが博覧会のcliを使用しているなら、あなたはRを押すことができます(それは大文字の 'R'です)。これでバンドル全体が再構築されます。時には開発モードに切り替えることも役に立ちます....
react-native
を使っている人のために:
import React, {
Component,
StyleSheet,
} from 'react-native';
このエラーが発生する可能性があります。
react
を直接参照するのがより安定した方法です。
import React, { Component } from 'react';
import { StyleSheet } from 'react-native';
私にとってはdefault
を忘れていました。だから私はexport class MyComponent
の代わりにexport default class MyComponent
を書きました
私のreact
とreact-dom
のバージョンがマージ後に一致しなかったので、私はこの問題を抱えていました。
手動で欲しいバージョン番号を入力してnpm install
を再実行することで修正しました。
私の場合、React <15.3.0にはReact.PureComponentが含まれていません。だからコードのように:
class MyClass extends React.PureComponent {
//...
}
うまくいかないでしょう。
コード内でrequire
の代わりにimport
を使用していた場合も同様です。
(Gruntタスクのように)このエラーが表示され、 Browserify および browserify-shim を使用している場合は、意図せずにbrowserify-shim
にReactを処理するように言われたグローバルネームスペースの一部(たとえば、CDNからロードされたもの)。
BrowserifyにReactを別のファイルではなく、変換の一部として含める場合は、"react": "global:React"
行が"browserify-shim"
ファイルのpackages.json
セクションに表示されないようにします。