reactjs, що дає помилку Uncaught TypeError: Супер вираження повинно бути або нульовим, або функцією, а не визначеним


256

Я використовую reactjs.

Коли я запускаю код нижче браузера, говорить:

Uncaught TypeError: Супервираз повинен бути або нульовим, або функцією, а не визначеним

Буде вдячний будь-які натяки на те, що не так.

Спочатку рядок, який використовується для складання коду:

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>

Сподіваюся, що це рятує когось ще три дні дорогоцінного життя.


111
Станом на 0,14,8, ви все одно можете отримати це, якщо зробите щось на зразок extends React.component(малі літери c).
Кевін Саттл

12
@Kevin просто хочу перефразовувати, в основному Якщо у вас десь є помилка друку, в моєму випадку це було Componentsзамість Component :). Ваш коментар допоміг BTW
P-RAD

Моя проблема в тому, що я не експортував клас в кінці файлу ...
R01010010

2
Я зробив React.Components (множина), справа - React.Component (однина). Добре ... як я пропустив це ...
Ісмаель,

5
@Kevin Suttle Ваш коментар насправді корисніший за відповідь
Мік Джонс

Відповіді:


325

Назви класів

По-перше, якщо ви впевнені, що ви переходите від правильно названого класу, наприклад, React.Component , а не React.component або React.createComponent, можливо, вам знадобиться оновити версію React. Дивіться відповіді нижче, щоб отримати докладнішу інформацію про класи, з яких можна продовжити.

Модернізація реагує

React підтримує лише класи в стилі ES6 з версії 0.13.0 (див. Офіційну публікацію в блозі про вступ до служби підтримки тут .

Перед цим під час використання:

class HelloMessage extends React.Component

ви намагалися використовувати ключові слова ES6 ( extends) для підкласу з класу, який не був визначений за допомогою ES6 class. Це було певно, чому ви зіткнулися з дивною поведінкою з superвизначеннями тощо.

Отже, так, TL; DR - оновлення до React v0.13.x.

Кругові залежності

Це також може статися, якщо у вас кругова структура імпорту. Один модуль імпортує інший та навпаки. У цьому випадку вам просто потрібно переробити код, щоб уникнути його. Більше інформації


202
Для всіх інших, хто має цю проблему, але оновлення React не є виправленням - прокрутіть далі до інших відповідей, це може бути проста помилка. У моєму випадку це було визначення класу, використовуючи React.componentзамістьReact.Component
Крістіан Бенке

1
FYI, старий клас класу також можна продовжити extends. Спробуйте це var x = function(){}; class y extends x {}
Mouneer

2
Це була кругла структура імпорту для мене. Дякуємо, що заощадили мені багато годин налагодження!
DrunkDevKek

4
Просто FYI. Нещодавно я отримав таку ж помилку, незважаючи на те, що був на ReactJS 16.x. Виявляється, у мене був помилковий помилок у цьому рядку: class App extends React.Component () {...}- який слід виправити class App extends React.Component {...} (без ()кінця)
Atlas7

1
Компонент "С" капіталу! #facepalm
Девід

127

Це означає, що ви хочете підклас щось, що має бути Class, але є undefined. Причини можуть бути:

  • вводиться Class extends ..., тож ви розширюєте невизначену змінну
  • вводиться import ... from, тому ви імпортуєте undefinedз модуля
  • згаданий модуль не містить значення, яке потрібно імпортувати (наприклад, застарілий модуль - випадок з React), тому ви імпортуєте неіснуюче значення ( undefined)
  • typo у export ...заяві модуля , на який посилається , він експортує невизначену змінну
  • згаданий модуль exportвзагалі відсутній у викладі, тому він експортує простоundefined

23
У моєму випадку це був малий регістр компонентів у React.Component.
Статистика навчання на прикладі

3
У моєму випадку це був самостійно написаний клас, неправильно імпортований. Я імпортував клас за замовчуванням експортується через import {Foo} from 'bar'замість import Foo from 'bar'. Тому прийнято.
xtra

4
Не робіть цього також: class Thing extends React.Component() {- мені довелося видалити()
activedecay

У моєму випадку ця помилка була викликана випадковим створенням кругової посилання тим, що я імпортував (клас, який я хотів поширити на підклас) у своїй функції надання компонентів. Коли я намагався виконати / відтворити підклас, оскільки суперклас не був створений, але він не визначений.
Леон

^ Викликана круговою посиланням і для мене.
Кайлен

90

Це також може бути викликано помилкою друку, тому замість великої Componentлітери C у вас є componentнижча c, наприклад:

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

Примітка . Джерело цієї помилки може бути, тому що існує, Reactі ми автоматично думаємо, що наступним має бути метод реагування або властивість, починаючи з малої літери, але насправді це інший клас ( Component), який повинен починатися з великої літери .


2
так, як не дивно, ця помилка не виявлена ​​під час кроку створення веб-пакету, але вона з’явиться під час виконання.
worc

31

У моєму випадку, з реакцією на місцях, помилка була в тому, що я мав

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';

2
Це спрацювало в моєму випадку! Документація, представлена ​​на рідному веб-сайті, має такий приклад :)
звичайний

Дякую, Компонент повинен імпортувати з "реагувати"
xyz

15

Я відчував це, коли пропустив експортну заяву для класу JSX.

Наприклад:

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

15

Ви також можете отримати це, якщо ви намагаєтеся виконати React.Componentз помилковим ()визначенням класу.

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

Що мені іноді вдається зробити, перетворюючи функціональну складову без громадянства в клас.


Це для мене було проблемою. дуже нерозумно. дуже дякую!
bstst

14

Я бачив цю помилку, коли у вас кругова залежність.

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

10

Для будь-яких інших осіб, які можуть розвинути це питання. Ви також можете перевірити, чи використовується componentметод з React.Componentвеликої літери. У мене був той самий випуск, і це викликало те, що я написав:

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

Я змінив це на

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

і все спрацювало добре


6

Я зрозумів це, коли вводив помилку на друк:

import {Comonent} from 'react';

Я також отримав це з розширеннями React.Components замість React.Component (без s).
П’єр Мауї

1
Я також отримав це, але для введення невеликої першої літери компонента - ... продовжує React.component {}
Іван Топич

5

Перевірка наявних класів насправді існує, амортизується декілька методів Реагування; це може бути помилка друку 'React.Components'замість'React.Component'

Щасти!!


У моєму випадку я використовував React.componentзамість React.Component(зауважте, що столиця "C" мені не вистачало)
Javis Perez

4

Я збираюся внести ще одне можливе рішення - те, яке працювало на мене. Я використовував індекс зручності для збору всіх компонентів в один файл.

Я не вірю, що під час написання це офіційно підтримується babel, і кидає машинопис в спин - проте я бачив, що він використовується в багатьох проектах і, безумовно, зручний.

Однак при використанні в поєднанні зі спадщиною, здається, випливає помилка, представлена ​​у вищезазначеному питанні.

Просте рішення полягає в тому, що модулі, які діють як батьки, потрібно імпортувати безпосередньо, а не через індексний файл зручності.

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

Це допомогло мені зрозуміти, що я зробив не так. Випадково загорнув ім’я компонента в {} в моєму повідомленні про імпорт. Тонка різниця. Ця помилка може бути важко помітити.
Dennis W


4

Webpack 4 шматки та хеші з утифікацією за допомогою TerserPlugin

Це може статися, коли Webpack використовує фрагменти та хеші з мінімізацією та відключенням через TerserPlugin (зараз у версії 1.2.3). У моєму випадку помилка була звужена до зменшення плагіном Terser мого vendors.[contenthash].jsпакета, який тримає мій node_modules. Все працювало, коли не використовували хеші.

Рішенням було виключити розшарування у варіантах зменшення:

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

Більше інформації


Це дійсно вирішило проблему для мене, однак я зміг визначити винуватця, і тому наприкінці я зміг застосувати уніфікацію. Дивіться мою відповідь - реагуйте-сліпуче.
Ерез Коен

Я звузився до терзерного плагіна, остаточно змінивши реакцію-скрипт до версії 3.2.0, вирішив проблему для мене.
avck

3

У мене те саме питання, просто перехід від Navigatorна{Navigator}

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

1
в основному воно повинно відповідати export Foo ... import { Foo }export default Foo ... import Foo
приблизно

3

Неправильно для цієї відповіді, але для інших із такою ж помилкою моя сміховинна помилка могла б допомогти.

Тупо, що в моїй проблемі було використання позначень функції, включивши () слідом за назвою класу .

Переконайтесь, що ваш синтаксис правильний. І ви імпортували та експортували будь-які зовнішні компоненти / модулі з правильними назвами та шляхами.

Цей шаблон повинен добре працювати, якщо у вас встановлена ​​нова версія react:

import React, { Component } from 'react'

class ExampleClass extends Component {

    render(){
        return(
            <div>

            </div>
        )
    }
}

export default ExampleClass 

3

Мої умови

  • Create-React-App
  • Сценарії реагування v3.2
  • Редактор текстових файлів Froala v3.1
  • Режим розробки справно працював
  • Виробництво було порушено з помилкою, згаданою у питанні

Вирішення моєї проблеми

Зменшіть Froala до версії 3.0.

Щось в v3.1 порушило наш процес створення додатків Create React.

Оновлення: Використовуйте сценарії реагування v3.3

Ми виявили, що між React Scripts 3.2 та Froala 3.1 виникала проблема.

Оновлення до React Scripts v3.3 дозволило нам перейти на Froala 3.1.


1
Я тебе люблю. Я хочу прийти знайти вас і поцілувати ноги !!!!!!!!!!!!!!!!!!!!!!!!!!! (Кошмар все
ближче

Я не використовую додаток create react, але зіткнувся з тією ж проблемою щодо prod із froala 3.1. Чи можете ви пояснити, в чому тут була проблема?
Каран Ярівала

2

Я написав

React.component

замість того React.Component було моє питання)) і шукав це більше півгодини.


2

У моєму випадку я використовував:

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
НЕ
ˣ React.componentабоReact.Components


Ласкаво просимо до SO. Мабуть очевидно, що ОП не допустили цієї помилки, оскільки вони включили правильну форму вже у запитання. Ви отримували ту саму помилку, що і ОП, але з іншою причиною?
Едуардо

Так, я отримував таку ж помилку, що і ОП, але я виявив, що причина в іншому, і сподіваюся, що це допоможе іншим.
Куш Гаутам

2

Можливо, причиною цього є сторонній пакет. У нашому випадку це була реакція-сліпуча . У нас аналогічні налаштування у @steine ​​( див. Цю відповідь вище ).

Для того, щоб знайти проблемний пакет, я запустив збірку веб-пакетів локально в режимі виробництва і, таким чином, зміг знайти проблемний пакет у сліді стека. Тож для нас це забезпечило рішення, і я зміг утримати знищення.


1

Використовуючи Babel (5.8), я отримую ту ж помилку, якщо намагаюся використовувати вираз export defaultу поєднанні з деякими іншими export:

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


1

У моєму випадку я виправив цю помилку, змінивши export default class yourComponent extends React.Component() {}на export default class yourComponent extends React.Component {}. Так, видалення дужок ()виправлено помилку.


1

У мене виникла помилка під час імпорту компонента, наприклад:

import React, { Components } from 'react';

замість

import React, { Component } from 'react';

1

Подивіться, якщо у вашому імпорті чи в поколінні класу помилка друку, це може бути просто так.


1

Змінити import React from 'react-domна import React, {Component} from 'react'
І змінити class Classname extends React.Componentна class Classname extends Component
Якщо ви використовуєте останню версію React (16.8.6 відтепер) .


0

Якщо ви отримуєте цю помилку і використовуєте Browserify та Browserify-shim (як у завданні Grunt), ви, можливо, пережили тупий момент, як я, коли ви ненавмисно сказали, browserify-shimщо React розглядається як уже частину глобального простору імен (наприклад, завантажено з CDN).

Якщо ви хочете, щоб Browrify включив React як частину перетворення, а не окремий файл, переконайтеся, що рядок "react": "global:React"не відображається у "browserify-shim"розділі вашого packages.jsonфайлу.


Як цього уникнути Uncaught Error: Cannot find module 'react'після видалення конфігурації браузера-shim? В основному я хочу продовжувати реагувати як на зовнішню залежність, але переглядати, здається, не розуміють, як створити пакет і зберегти Реагу зовнішньою. Це може бути, а може бути, тому що модуль, який я включаю в свою точку входу для перегляду, реагував як залежність.
dmarr

FWIW, видаляючи реакцію з конфігурації браузера, і дозволяючи браузеру узгоджувати залежність, як правило, все ще призводить до проблеми ОП.
dmarr

0

Це також може статися, якщо ви використовували requireзамість importкоду.


0

Зі мною теж сталося, коли я користувався цим:

class App extends React.Component(){

}

Замість правильного:

class App extends React.Component{

}

Зверніть увагу: - () в першому, що є основною причиною цієї проблеми


0

Для тих, хто використовує react-native:

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

може призвести до цієї помилки.

Тоді як reactпряме посилання є більш стабільним шляхом:

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

0

У моєму випадку виправлення цієї помилки зробило зміна React.Element на React.Component.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.