reazione che dà errore TypeError non rilevato: l'espressione Super deve essere nulla o una funzione, non indefinita


256

Sto usando Reajs.

Quando eseguo il codice sotto il browser dice:

TypeError non rilevato: la super espressione deve essere nulla o una funzione, non definita

Qualsiasi suggerimento su ciò che è sbagliato sarebbe apprezzato.

Innanzitutto la riga utilizzata per compilare il codice:

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

E il codice:

var React = require('react');

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

AGGIORNAMENTO: Dopo aver bruciato all'inferno per tre giorni su questo problema, ho scoperto che non stavo usando l'ultima versione di reagire.

Installa a livello globale:

sudo npm install -g react@0.13.2

installa localmente:

npm install react@0.13.2

assicurati che anche il browser stia usando la versione giusta:

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

Spero che questo salvi a qualcun altro tre giorni di vita preziosa.


111
A partire da 0.14.8, puoi ancora ottenerlo se fai qualcosa di simile extends React.component(minuscolo c).
Kevin Suttle,

12
@Kevin voglio solo riformulare, fondamentalmente Se hai un refuso lì da qualche parte, nel mio caso è stato Componentsinvece di Component :). Il tuo commento ha aiutato BTW
P-RAD il

Il mio problema era che non stavo esportando la classe alla fine del file ...
R01010010

2
Ho fatto React.Components (plurale), il giusto è React.Component (singolare) Ow bene ... come mi sono perso ...
Ismael,

5
@Kevin Suttle Il tuo commento è in realtà più utile della risposta
Mick Jones,

Risposte:


325

Nomi delle classi

In primo luogo, se si è certi di estendersi dalla classe denominata correttamente, ad esempio React.Component , non React.component o React.createComponent, potrebbe essere necessario aggiornare la versione di React. Vedi le risposte sotto per maggiori informazioni sulle classi da cui estendere.

Aggiorna React

React supporta solo le classi in stile ES6 dalla versione 0.13.0 (vedere il loro post sul blog ufficiale sull'introduzione al supporto qui .

Prima di ciò, quando si utilizza:

class HelloMessage extends React.Component

stavi tentando di utilizzare le parole chiave ES6 ( extends) per sottoclassare da una classe che non è stata definita usando ES6 class. Questo è probabilmente il motivo per cui hai riscontrato strani comportamenti con superdefinizioni ecc.

Quindi, sì, TL; DR : aggiorna a React v0.13.x.

Dipendenze circolari

Ciò può verificarsi anche se si dispone di una struttura di importazione circolare. Un modulo importa un altro e viceversa. In questo caso, devi solo riformattare il codice per evitarlo. Ulteriori informazioni


202
Per tutti gli altri che hanno questo problema ma l'aggiornamento di React non è la soluzione: scorri più in basso fino alle altre risposte, potrebbe essere un semplice errore di battitura. Nel mio caso era una definizione di classe usando React.componentinvece diReact.Component
Christian Benke l'

1
Cordiali saluti, la vecchia classe può essere estesa anche con extends. Prova questo var x = function(){}; class y extends x {}
Mouneer

2
Era una struttura di importazione circolare per me. Grazie per avermi risparmiato molte ore di debug!
DrunkDevKek,

4
Cordiali saluti. Recentemente ho avuto lo stesso errore nonostante fosse su ReactJS 16.x. Si scopre che ho avuto un refuso in questa riga: class App extends React.Component () {...}- che dovrebbe essere corretto class App extends React.Component {...} (senza il ()alla fine)
Atlas7

1
Componente "C" maiuscola! #facepalm
David

127

Questo significa che vuoi sottoclasse qualcosa, che dovrebbe essere Class, ma lo è undefined. Le ragioni potrebbero essere:

  • errore di battitura Class extends ..., quindi si estende la variabile non definita
  • errore di battitura import ... from, quindi si importa undefineddal modulo
  • il modulo di riferimento non contiene il valore, si desidera importare (ad esempio modulo obsoleto - caso con React), quindi importare valore non esistente ( undefined)
  • errore di battitura nell'istruzione del modulo di riferimento export ..., quindi esporta una variabile non definita
  • exportdichiarazione mancante del modulo di riferimento , quindi esporta soloundefined

23
Nel mio caso era una minuscola componente in React.Component.
Apprendimento delle statistiche con l'esempio del

3
Nel mio caso si trattava di una classe scritta da sé non importata correttamente. Stavo importando la classe esportata predefinita tramite import {Foo} from 'bar'anziché import Foo from 'bar'. Eseguito quindi l'upgrade.
xtra

4
Non farlo neanche: class Thing extends React.Component() {- Ho dovuto rimuovere il()
activedecay il

Nel mio caso questo errore è stato causato dalla creazione accidentale di un riferimento circolare da ciò che stavo importando (la classe che volevo estendere alla sottoclasse) nella funzione di rendering dei miei componenti. Quando ho provato a eseguire / eseguire il rendering della sottoclasse poiché la superClasse non è stata creata ma non è stata definita.
Leon,

^ Causato da un riferimento circolare anche per me.
Cailen,

90

Può anche essere causato da un errore di battitura, quindi invece che Componentcon la maiuscola C, hai componentcon una c inferiore, ad esempio:

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

Nota: l'origine di questo errore potrebbe essere perché esiste Reacte pensiamo automaticamente che ciò che verrà dopo dovrebbe essere un metodo o una proprietà di reazione che inizia con una lettera minuscola, ma in realtà è un'altra Class ( Component) che dovrebbe iniziare con una lettera maiuscola .


2
stranamente questo errore non viene rilevato durante la fase di creazione del webpack, ma verrà visualizzato in fase di esecuzione.
worc,

31

Nel mio caso, con reattivo nativo, l'errore era che avevo

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

invece di

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

2
Questo ha funzionato nel mio caso! La documentazione fornita nel sito nativo di reazione ha questo esempio
errato

Grazie, il componente dovrebbe importare da 'reagire'
xyz

15

L'ho sperimentato quando mancava una dichiarazione di esportazione per la classe JSX.

Per esempio:

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

15

Puoi anche riceverlo se stai tentando di eseguire React.Componentun errore ()nella definizione della tua classe.

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

Che a volte riesco a fare quando sto convertendo da un componente funzionale senza stato a una classe.


Questo è stato il problema per me. molto sciocco. molte grazie!
1919

14

Ho visto questo errore quando hai una dipendenza circolare.

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

10

Per qualsiasi altra persona, questo potrebbe sviluppare questo problema. È inoltre possibile verificare che il componentmetodo React.Componentsia in maiuscolo. Ho avuto lo stesso problema e ciò che ha causato è stato che ho scritto:

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

L'ho cambiato in

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

e tutto ha funzionato bene


6

Ho avuto questo quando ho avuto un refuso sulla mia importazione:

import {Comonent} from 'react';

Ho anche ottenuto questo con estende React.Components invece di React.Component (no s).
Pierre Maoui,

1
Ho anche ottenuto questo, ma per aver digitato la prima lettera di un componente - ... estende React.component {}
Ivan Topić,

5

Verifica che le Classi che estendi esistano effettivamente, alcuni metodi React sono ammortizzati, Potrebbe anche essere un errore di battitura 'React.Components'invece di'React.Component'

In bocca al lupo!!


Nel mio caso stavo usando React.componentinvece di React.Component(nota la "C" che mi mancava)
Javis Perez,

4

Contribuirò con un'altra possibile soluzione, una che ha funzionato per me. Stavo usando l'indice di convenienza per raccogliere tutti i componenti in un unico file.

Non credo che al momento della stesura di questo sia ufficialmente supportato da Babel, e getta dattiloscritto in un giro - tuttavia l'ho visto usato in molti progetti ed è sicuramente conveniente.

Tuttavia, se usato in combinazione con l'ereditarietà sembra gettare l'errore presentato nella domanda sopra.

Una soluzione semplice è che per i moduli che fungono da genitori devono essere importati direttamente anziché tramite un file indice di convenienza.

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

Questo mi ha aiutato a capire cosa ho fatto di sbagliato. Avvolto per errore il nome del componente in {} nella mia dichiarazione di importazione. Differenza sottile. Può essere difficile individuare quell'errore.
Dennis W,

4

Questo ha funzionato per me:

import React, {Component} from 'react';

4

Webpack 4 blocchi e hash con Uglification di TerserPlugin

Ciò può verificarsi quando Webpack utilizza blocchi e hash con minificazione e unglification tramite TerserPlugin (attualmente nella versione 1.2.3). Nel mio caso l'errore è stato ridotto alla brutalizzazione del plugin Terser del mio vendors.[contenthash].jspacchetto che contiene il mio node_modules. Tutto ha funzionato quando non si usano gli hash.

La soluzione era di escludere il pacchetto nelle opzioni di uglificazione:

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

Ulteriori informazioni


Ciò ha effettivamente risolto il problema per me, tuttavia sono stato in grado di individuare il colpevole e così alla fine sono stato in grado di applicare l'ugrificazione. Vedi la mia risposta: reagire-abbagliare.
Erez Cohen,

Mi sono limitato al plug-in Terser, cambiando infine reagire-script alla versione 3.2.0 risolto il problema per me.
avck

3

Ho lo stesso problema, basta cambiare da Navigatora{Navigator}

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

1
fondamentalmente dovrebbe corrispondere in questo modo: export Foo ... import { Foo } - oppure - export default Foo ... import Foo
dpren l'

3

Non corretto per questa risposta, ma per gli altri con lo stesso errore il mio errore ridicolmente sciocco potrebbe potenzialmente aiutare.

Stupidamente, il mio problema stava usando la notazione di funzione includendo () seguendo il nome della classe .

Assicurarsi che la sintassi sia corretta. E hai importato ed esportato tutti i componenti / moduli esterni con i nomi e i percorsi corretti.

Questo modello dovrebbe funzionare correttamente se è installata una nuova versione di reagire:

import React, { Component } from 'react'

class ExampleClass extends Component {

    render(){
        return(
            <div>

            </div>
        )
    }
}

export default ExampleClass 

3

Le mie condizioni

  • Crea-React-app
  • React-scripts v3.2
  • Froala rich text editor v3.1
  • La modalità di sviluppo ha funzionato bene
  • La build di produzione è stata interrotta con l'errore indicato nella domanda

Soluzione al mio problema

Esegui il downgrade di Froala alla v3.0.

Qualcosa nella v3.1 ha rotto il nostro processo di creazione di Crea React App.

Aggiornamento: utilizzare gli script di reazione v3.3

Abbiamo scoperto che c'era un problema tra React Scripts 3.2 e Froala 3.1.

L'aggiornamento a React Scripts v3.3 ci ha permesso di aggiornare a Froala 3.1.


1
Ti amo. Voglio venire a trovarti e baciarti i piedi !!!!!!!!!!!!!!!!!!!!!!!!!! (Nightmare all-night over)
GaddMaster

Non sto usando l'app di creazione di reazione, ma sto affrontando lo stesso problema su prod con froala 3.1. Puoi spiegare qual è stato il problema qui?
Karan Jariwala

2

Ho scritto

React.component

invece di React.Component Quello era il mio problema)) e lo cercavo da più di mezz'ora.


2

Nel mio caso stavo usando:

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

che era sbagliato ma corretto è:

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

assicurati anche che ci sia
React.Component
NOT
ˣ React.componentoReact.Components


Benvenuti in SO. Sembra chiaro che l'OP non abbia commesso questo errore in quanto ha già inserito il modulo corretto nella domanda. Stavi ottenendo lo stesso errore di OP ma con una causa diversa?
Eduardo,

Sì, stavo ricevendo lo stesso errore di OP, ma ho scoperto che la causa era diversa e spero che questo possa aiutare gli altri.
Kush Gautam,

2

Potrebbe esserci un pacchetto di terze parti che causa questo. Nel nostro caso è stato reattivo . Abbiamo impostazioni simili a quelle di @steine ​​( vedi questa risposta sopra ).

Per trovare il pacchetto problematico ho eseguito il webpack compilato localmente con la modalità di produzione e quindi sono stato in grado di trovare il pacchetto problematico nella traccia dello stack. Quindi per noi questo ha fornito la soluzione e sono stato in grado di mantenere l'ugurazione.


1

Usando Babel (5.8) ottengo lo stesso errore se provo ad usare l'espressione export defaultin combinazione con altri export:

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


1

Nel mio caso, ho corretto questo errore cambiando export default class yourComponent extends React.Component() {}in export default class yourComponent extends React.Component {}. Sì, eliminare la parentesi ha ()corretto l'errore.


1

Ho riscontrato questo errore durante l'importazione del componente come:

import React, { Components } from 'react';

invece di

import React, { Component } from 'react';

1

Se hai un errore di battitura nella tua importazione o nella generazione della tua classe, potrebbe essere semplicemente quello.


1

Cambia import React from 'react-domin import React, {Component} from 'react'
E cambia class Classname extends React.Componentin class Classname extends Component
Se stai usando l'ultima versione di React (16.8.6 a partire da ora) .


0

Se ricevi questo errore e stai utilizzando Browserify e browserify-shim (come in un'attività Grunt), potresti aver vissuto un momento stupido come quello in cui ho detto involontariamente browserify-shimdi trattare React come già parte dello spazio dei nomi globale (ad esempio, caricato da un CDN).

Se vuoi che Browserify includa React come parte della trasformazione e non un file separato, assicurati che la linea "react": "global:React"non appaia nella "browserify-shim"sezione del tuo packages.jsonfile.


Come evitare Uncaught Error: Cannot find module 'react'dopo aver rimosso la configurazione browserify-shim? Fondamentalmente voglio continuare a reagire come dipendenza esterna ma browserify sembra non capire come costruire il bundle e mantenere React esterno. Ciò può essere dovuto al fatto che il modulo che sto includendo nel mio punto di ingresso browserify ha reagito come una dipendenza.
dmarr,

FWIW, rimuovere la reazione dalla configurazione di browserify-shim e consentire a browserify di riconciliare la dipendenza normalmente comporta ancora il problema del PO.
dmarr,

0

Questo può accadere anche se lo avessi usato al requireposto del importtuo codice.


0

È successo anche a me quando l'ho usato:

class App extends React.Component(){

}

Invece di quello giusto:

class App extends React.Component{

}

Avviso: - () nel primo che è la causa principale di questo problema


0

Per coloro che utilizzano react-native:

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

potrebbe produrre questo errore.

Considerando che il riferimento reactdiretto è il modo più stabile per andare:

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

0

Nel mio caso è stata la modifica di React.Element a React.Component a correggere questo errore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.