reaktjs dające błąd Nieprzechwycony typ błędu: Wyrażenie super musi mieć wartość null lub funkcję, nie może być niezdefiniowana


256

Korzystam z Reagjs.

Po uruchomieniu kodu poniżej przeglądarka mówi:

Uncaught TypeError: Super wyrażenie musi być null lub funkcja, nie może być niezdefiniowana

Wszelkie wskazówki dotyczące tego, co jest złe, będą mile widziane.

Najpierw wiersz użyty do skompilowania kodu:

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

I kod:

var React = require('react');

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

AKTUALIZACJA: Po spaleniu w piekle przez trzy dni tego problemu stwierdziłem, że nie korzystam z najnowszej wersji reagowania.

Zainstaluj globalnie:

sudo npm install -g react@0.13.2

zainstaluj lokalnie:

npm install react@0.13.2

upewnij się, że przeglądarka również używa właściwej wersji:

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

Mam nadzieję, że to ocali komuś trzy dni cennego życia.


111
Począwszy od 0.14.8, nadal możesz to uzyskać, jeśli robisz coś takiego extends React.component(małe litery c).
Kevin Suttle,

12
@ Kevin po prostu chce przeformułować, w zasadzie Jeśli masz gdzieś literówkę, w moim przypadku było to Componentszamiast Component :). Twój komentarz pomógł BTW
P-RAD

Mój problem polegał na tym, że nie eksportowałem klasy na końcu pliku ...
R01010010

2
Zrobiłem React.Components (liczba mnoga), po prawej jest React.Component (liczba pojedyncza) Ow dobrze ... jak mi tego brakowało ...
Ismael

5
@Kevin Suttle Twój komentarz jest w rzeczywistości bardziej przydatny niż odpowiedź
Mick Jones

Odpowiedzi:


325

Nazwy klas

Po pierwsze, jeśli masz pewność, że rozszerzasz klasę o poprawnej nazwie, np. React.Component , a nie React.component lub React.createComponent, może być konieczne uaktualnienie wersji React. Zobacz odpowiedzi poniżej, aby uzyskać więcej informacji na temat klas, z których można rozszerzyć.

Upgrade React

React obsługuje tylko klasy w stylu ES6 od wersji 0.13.0 (zobacz ich oficjalny post na blogu na wstępie wsparcia tutaj .

Wcześniej podczas korzystania z:

class HelloMessage extends React.Component

próbowałeś użyć słów kluczowych ES6 ( extends) do podklasy z klasy, która nie została zdefiniowana za pomocą ES6 class. Prawdopodobnie dlatego zachowywałeś się dziwnie z superdefinicjami itp.

Tak, TL; DR - aktualizacja do React v0.13.x.

Zależności kołowe

Może się to również zdarzyć, jeśli masz cykliczną strukturę importu. Jeden moduł importuje inny i na odwrót. W takim przypadku wystarczy zmodyfikować kod, aby go uniknąć. Więcej informacji


202
Dla wszystkich innych, którzy mają ten problem, ale aktualizacja React nie jest poprawką - przewiń dalej w dół do innych odpowiedzi, może to być zwykła literówka. W moim przypadku była to definicja klasy, w której React.componentzamiastReact.Component
Christian Benke,

1
FYI, klasę starego sposobu można również rozszerzyć o extends. Spróbuj tego var x = function(){}; class y extends x {}
Mouneer,

2
To była dla mnie okrągła struktura importu. Dzięki za oszczędność mi wielu godzin debugowania!
DrunkDevKek

4
Po prostu dla ciebie. Niedawno dostałem ten sam błąd, mimo że korzystałem z ReactJS 16.x. Okazuje się, że miałem literówkę w tym wierszu: class App extends React.Component () {...}- którą należy poprawić class App extends React.Component {...} (bez ()końca)
Atlas7

1
Kapitałowy składnik „C”! #facepalm
David

127

Oznacza to, że chcesz podklasy coś, co powinno być Class, ale jest undefined. Przyczyny mogą być następujące:

  • literówka Class extends ..., więc rozszerzasz niezdefiniowaną zmienną
  • literówka import ... from, więc importujesz undefinedz modułu
  • moduł odniesienia nie zawiera wartości, którą chcesz zaimportować (np. przestarzały moduł - wielkość liter w React), więc importujesz nieistniejącą wartość ( undefined)
  • literówka w przywołanej export ...instrukcji modułu , więc eksportuje niezdefiniowaną zmienną
  • brak odnośnika do modułu exportw ogóle, więc eksportuje tylkoundefined

23
W moim przypadku była to mała litera Component w React.Component.
Nauka statystyk na przykładzie

3
W moim przypadku była to klasa napisana samodzielnie, niepoprawnie zaimportowana. Importowałem domyślną eksportowaną klasę przez import {Foo} from 'bar'zamiast import Foo from 'bar'. Dlatego głosowałem.
xtra

4
Nie rób tego też: class Thing extends React.Component() {- Musiałem usunąć()
Activedecay

W moim przypadku ten błąd został spowodowany przez przypadkowe utworzenie odwołania cyklicznego na podstawie tego, co importowałem (klasa, którą chciałem rozszerzyć do podklasy) w mojej funkcji renderowania komponentów. Kiedy próbowałem wykonać / wyrenderować podklasę, ponieważ superklasa nie została jeszcze utworzona, nie została zdefiniowana.
Leon

^ Spowodowane również okrągłym odniesieniem do mnie.
Cailen

90

Może to być również spowodowane błędem w literówce, więc zamiast dużej litery ComponentC masz componentniższą wartość c, na przykład:

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

Uwaga: Przyczyną tego błędu może być to, że istnieje Reacti uważamy automatycznie, że następną powinna być metoda lub właściwość reagowania zaczynająca się od małej litery, ale w rzeczywistości jest to kolejna klasa ( Component), która powinna zaczynać się wielką literą .


2
huh, co dziwne, ten błąd nie został wykryty podczas kompilacji pakietu, ale pojawi się w czasie wykonywania.
worc,

31

W moim przypadku, w przypadku reakcji rodzimej, błąd polegał na tym, że miałem

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

zamiast

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

2
To zadziałało w moim przypadku! Dokumentacja dostarczona na stronie z
reakcją

Dzięki, komponent powinien zaimportować z „reaguj”
xyz

15

Doświadczyłem tego, gdy brakowało mi instrukcji eksportu dla klasy JSX.

Na przykład:

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

15

Możesz to również otrzymać, jeśli próbujesz wykonać React.Componentz błędną ()definicją klasy.

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

Co czasem udaje mi się zrobić, kiedy przechodzę z bezpaństwowego komponentu funkcjonalnego do klasy.


To był dla mnie problem. bardzo chory. wielkie dzięki!
bstst

14

Widziałem ten błąd, gdy masz zależność cykliczną.

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

10

Dla innych osób, które mogą rozwinąć ten problem. Możesz również sprawdzić, czy componentmetoda w React.Componentjest wielka. Miałem ten sam problem i to, co spowodowało, że napisałem:

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

Zmieniłem to na

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

i wszystko działało dobrze


6

Dostałem to, gdy miałem literówkę przy moim imporcie:

import {Comonent} from 'react';

Mam również to z rozszerzeniami React.Components zamiast React.Component (brak s).
Pierre Maoui,

1
Mam to również, ale za wpisanie małej pierwszej litery komponentu - ... rozszerza React.component {}
Ivan Topić

5

Sprawdź, czy klasy, które rozszerzasz, faktycznie istnieją, kilka metod React jest amortyzowanych, może to być także błąd literowy 'React.Components'zamiast'React.Component'

Powodzenia!!


W moim przypadku użyłem React.componentzamiast React.Component(zauważ wielką
literę

4

Przedstawię inne możliwe rozwiązanie, które dla mnie zadziałało. Korzystałem z indeksu wygody, aby zebrać wszystkie komponenty w jeden plik.

Nie wierzę, że w chwili pisania tego jest oficjalnie wspierane przez Babel i rzuca maszynopis na spin - jednak widziałem, że jest używany w wielu projektach i jest zdecydowanie wygodny.

Jednak w połączeniu z dziedziczeniem wydaje się, że generuje błąd przedstawiony w powyższym pytaniu.

Prostym rozwiązaniem jest, aby moduły działające jak rodzice musiały zostać zaimportowane bezpośrednio zamiast przez plik indeksu wygody.

./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 {        
}

To pomogło mi zrozumieć, co zrobiłem źle. Przypadkowo zapakowałem nazwę komponentu w {} w moim zestawieniu importu. Subtelna różnica. Trudno jest dostrzec ten błąd.
Dennis W

4

To działało dla mnie:

import React, {Component} from 'react';

4

Webpack 4 Chunks and Hashes with Uglification by TerserPlugin

Może się to zdarzyć, gdy Webpack używa fragmentów i skrótów z minimalizacją i nielifikacją za pośrednictwem TerserPlugin (obecnie w wersji 1.2.3). W moim przypadku błąd został zawężony do uglifikacji przez wtyczkę Terser mojego vendors.[contenthash].jspakietu, który ją przechowuje node_modules. Wszystko działało, gdy nie używasz skrótów.

Rozwiązaniem było wykluczenie pakietu w opcjach uglifikacji:

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

Więcej informacji


To rzeczywiście rozwiązało problem dla mnie, ale byłem w stanie wskazać winowajcę, a więc na koniec mogłem zastosować uglifikację. Zobacz moją odpowiedź - olśnij reagować.
Erez Cohen,

Zawęziłem się do wtyczki terser, ostatecznie zmiana skryptu reagowania na wersję 3.2.0 rozwiązała problem.
avck

3

Mam ten sam problem, po prostu zmień z Navigatorna{Navigator}

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

1
w zasadzie powinno pasować tak: export Foo ... import { Foo } - lub - export default Foo ... import Foo
dpren

3

Niepoprawna dla tej odpowiedzi, ale dla innych z tym samym błędem mój absurdalnie głupi błąd może potencjalnie pomóc.

Głupio, że mój problem polegał na użyciu notacji funkcji poprzez włączenie () po nazwie klasy .

Upewnij się, że Twoja składnia jest poprawna. Zaimportowałeś i wyeksportowałeś zewnętrzne komponenty / moduły z poprawnymi nazwami i ścieżkami.

Ten szablon powinien działać poprawnie, jeśli masz zainstalowaną nową wersję Reaguj:

import React, { Component } from 'react'

class ExampleClass extends Component {

    render(){
        return(
            <div>

            </div>
        )
    }
}

export default ExampleClass 

3

Moje warunki

  • Utwórz aplikację React
  • React-scripts v3.2
  • Bogaty edytor tekstu Froala v3.1
  • Tryb programowania działał dobrze
  • Kompilacja produkcyjna została zerwana z błędem wymienionym w pytaniu

Rozwiązanie mojego problemu

Zmień wersję Froala na v3.0.

Coś w wersji 3.1 złamało nasz proces tworzenia aplikacji Create React.

Aktualizacja: użyj skryptów reagujących w wersji 3.3

Odkryliśmy, że był problem między React Scripts 3.2 a Froala 3.1.

Aktualizacja do skryptów React v3.3 pozwoliła nam na aktualizację do Froala 3.1.


1
Kocham Cię. Chcę cię znaleźć i pocałować w stopy !!!!!!!!!!!!!!!!!!!!!!!!! (Nightmare all-
night

Nie używam aplikacji create reag, ale mam ten sam problem na prod z froala 3.1. Czy możesz wyjaśnić, na czym polega problem?
Karan Jariwala

2

Napisałem

React.component

zamiast React.Component tego był mój problem)) i szukałem tego ponad pół godziny.


2

W moim przypadku korzystałem z:

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

co było złe, ale poprawne to:

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

upewnij się również, że nie ma
React.Component
NIE
ˣ React.componentlubReact.Components


Witamy w SO. Wydaje się jasne, że OP nie popełnił tego błędu, ponieważ już w pytaniu umieścili prawidłowy formularz. Czy otrzymujesz ten sam błąd co OP, ale z innej przyczyny?
Eduardo,

Tak, otrzymywałem ten sam błąd co OP, ale odkryłem, że przyczyna była inna i mam nadzieję, że to pomoże innym.
Kush Gautam

2

Przyczyną tego może być pakiet innej firmy. W naszym przypadku było to olśniewające . Mamy podobne ustawienia jak w @steine ​​( patrz ta odpowiedź powyżej ).

Aby znaleźć problematyczny pakiet, uruchomiłem wersję webpack lokalnie w trybie produkcyjnym, dzięki czemu mogłem znaleźć problematyczny pakiet w śladzie stosu. Więc dla nas to pod warunkiem, że rozwiązanie i udało mi się utrzymać uglification.


1

Za pomocą Babel (5.8) pojawia się ten sam błąd, jeśli próbuję użyć wyrażenia export defaultw połączeniu z innymi export:

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


1

W moim przypadku naprawiłem ten błąd, zmieniając export default class yourComponent extends React.Component() {}na export default class yourComponent extends React.Component {}. Tak, usuń nawias ()naprawiono błąd.


1

Wystąpił ten błąd podczas importowania komponentu, takiego jak:

import React, { Components } from 'react';

zamiast

import React, { Component } from 'react';

1

Sprawdź, czy masz błąd w pisowni podczas importowania lub generowania klasy, może to być po prostu to.


1

Zmień import React from 'react-domna import React, {Component} from 'react'
I zmień class Classname extends React.Componentna class Classname extends Component
Jeśli używasz najnowszej wersji React (od teraz 16.8.6) .


0

Jeśli otrzymujesz ten błąd i używasz Browserify i Browserify-shim (jak w zadaniu Grunt), być może doświadczyłeś głupiego momentu, tak jak ja, w którym mimowolnie browserify-shimkazałeś traktować React jako już część globalnej przestrzeni nazw (na przykład załadowane z CDN).

Jeśli chcesz, aby Browserify uwzględnił React jako część transformacji, a nie osobny plik, upewnij się, że linia "react": "global:React"nie pojawia się w "browserify-shim"sekcji packages.jsonpliku.


Jak uniknąć Uncaught Error: Cannot find module 'react'po usunięciu konfiguracji shimpera? Zasadniczo chcę nadal reagować jako zależność zewnętrzna, ale przeglądanie wydaje się nie rozumieć, jak zbudować pakiet i zachować React zewnętrzny. Może tak być, ale nie musi, ponieważ moduł, który dołączam do mojego punktu wejścia do przeglądania, zareagował jako zależność.
dmarr

FWIW, usunięcie reagowania z konfiguracji shimperów przeglądarkowych i zezwolenie browserrifyowi na uzgadnianie zależności normalnie nadal powoduje problem PO.
dmarr

0

Może się to również zdarzyć, jeśli użyłeś requirezamiast importw swoim kodzie.


0

Zdarzyło mi się również, gdy użyłem tego:

class App extends React.Component(){

}

Zamiast właściwego:

class App extends React.Component{

}

Uwaga: - () w pierwszym, który jest główną przyczyną tego problemu


0

Dla osób używających react-native:

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

może powodować ten błąd.

Podczas gdy reactbezpośrednie odwoływanie się jest bardziej stabilnym sposobem:

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

0

W moim przypadku zmiana React.Element na React.Component naprawia ten błąd.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.