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.

Książę Dougal
źródło
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

Jack Preston
źródło
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
Vaclav Novotny
źródło
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ą .

ismnoiet
źródło
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';
tonatiuhnb
źródło
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
Izocyjanian allilu
źródło
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.

Adam Terlson
źródło
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 {}
Doug
źródło
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

Van_Paitin
źródło
6

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

import {Comonent} from 'react';
Matthew Herbst
źródło
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!!

Ignacy Andrzej
źródło
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 {        
}
Chris
źródło
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';
Armen
źródło
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

Anders Steinrud
źródło
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'
Mike Nguyen
źródło
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 
Złupić
źródło
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.

Daniel Tonon
źródło
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.

Руслан
źródło
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

Kush Gautam
źródło
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.

Erez Cohen
źródło
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() {}
Griffosx
źródło
1

Oto jedna odpowiedź:

import React, { Component } from 'react'; // NOT 'react-dom'
Viktor Velev
źródło
dokładnie moja literówka
Evandro Pomatti
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.

Jeff Tian
źródło
1

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

import React, { Components } from 'react';

zamiast

import React, { Component } from 'react';
Ashvini Maurya
źródło
1

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

HoCo_
źródło
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) .

Neeraj Sewani
źródło
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.

Lachlan McD.
źródło
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.

bhagyas
źródło
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


źródło
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';
Mari Gallegos
źródło
0

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

SkorpEN
źródło