responsejs, выдавая ошибку Uncaught TypeError: Супер-выражение должно быть либо нулевым, либо функцией, а не неопределенным


256

Я использую реагирование.

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

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 :). Ваш комментарий помог КСТАТИ
P-RAD

Моя проблема была в том, что я не экспортировал класс в конец файла ...
R01010010

2
Я сделал React.Components (множественное число), право React.Component (единственное) Ой хорошо ... как я пропустил это ...
Исмаэль

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

Ответы:


325

Имена классов

Во-первых, если вы уверены, что выходите из класса с правильно названным именем, например React.Component , а не React.component или React.createComponent, вам может потребоваться обновить версию React. Смотрите ответы ниже для получения дополнительной информации о классах, чтобы продолжить.

Обновление Реакция

Начиная с версии 0.13.0 React поддерживает только классы в стиле ES6 (см. Их официальное сообщение в блоге о введении поддержки здесь .

До этого при использовании:

class HelloMessage extends React.Component

Вы пытались использовать ключевые слова ES6 ( extends) для создания подкласса в классе, который не был определен с помощью ES6 class. Вероятно, именно поэтому вы столкнулись со странным поведением с superопределениями и т. Д.

Итак, да, TL; DR - обновление до React v0.13.x.

Круговые зависимости

Это также может произойти, если у вас есть круговая структура импорта. Один модуль импортирует другой, и наоборот. В этом случае вам просто нужно реорганизовать свой код, чтобы избежать его. Больше информации


202
Для всех остальных, у которых есть эта проблема, но обновление React не является исправлением - прокрутите дальше вниз к другим ответам, это может быть простая опечатка. В моем случае это было определение класса с использованием React.componentвместоReact.Component
Кристиан Бенке

1
К вашему сведению, старый класс также может быть расширен extends. Попробуйте это var x = function(){}; class y extends x {}
Mouneer

2
Это была круговая структура импорта для меня. Спасибо, что сэкономили мне много часов на отладку!
DrunkDevKek

4
Просто к вашему сведению. Недавно я получил ту же ошибку, несмотря на то, что я был на 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)
  • опечатка в указанном 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
Это сработало в моем случае! Документация, представленная на сайте
Reaction

Спасибо, Компонент должен импортировать из «реакции»
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 (нет).
Пьер Мауи

1
Я также получил это, но для ввода маленькой первой буквы компонента - ... extends React.component {}
Иван Топич

5

Проверьте, что классы, которые вы расширяете, действительно существуют, некоторые методы React устарели. Это также может быть ошибкой опечатки 'React.Components'вместо'React.Component'

Удачи!!


В моем случае я использовал React.componentвместо React.Component(обратите внимание на пропущенную
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 {        
}

Это помогло мне понять, что я сделал не так. Случайно обернул имя компонента в {} в моем операторе импорта. Тонкая разница. Может быть трудно обнаружить эту ошибку.
Деннис Вт


4

Webpack 4 чанков и хешей с увеличением с помощью TerserPlugin

Это может произойти, когда Webpack использует куски и хэши с минификацией и расклиниванием через TerserPlugin (в настоящее время на версии 1.2.3). В моем случае ошибка сузилась до плагинов Terser моего vendors.[contenthash].jsпакета, который содержит мой node_modules. Все работало, когда не использовались хэши.

Решением было исключить расслоение в опциях uglification:

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

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


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

Я сузился до плагин Terser, в конечном итоге изменение реакции-скрипт до версии 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
dpren

3

Не правильно для этого ответа, но для других с той же ошибкой моя нелепо глупая ошибка потенциально может помочь.

Глупо, моя проблема заключалась в использовании функции обозначения включением () после имени класса .

Убедитесь, что ваш синтаксис правильный. И вы импортировали и экспортировали любые внешние компоненты / модули с правильными именами и путями.

Этот шаблон должен нормально работать, если у вас установлена ​​новая версия реакции:

import React, { Component } from 'react'

class ExampleClass extends Component {

    render(){
        return(
            <div>

            </div>
        )
    }
}

export default ExampleClass 

3

Мои условия

  • Create-React-приложения
  • React-скрипты v3.2
  • Froala Rich Text Editor 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
Я тебя люблю. Я хочу прийти, чтобы найти вас и поцеловать ваши ноги !!!!!!!!!!!!!!!!!!!!!!!!! (Кошмарная ночь)
GaddMaster

Я не использую приложение create response, но сталкиваюсь с той же проблемой в 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


Добро пожаловать в ТАК. Кажется очевидным, что ФП не допустил этой ошибки, так как они включили правильную форму уже в вопрос. Вы получили ту же ошибку, что и OP, но по другой причине?
Эдуардо

Да, я получал ту же ошибку, что и OP, но обнаружил, что причина была в другом, и надеюсь, что это поможет другим.
Куш Гаутам

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).

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


Как вы избегаете Uncaught Error: Cannot find module 'react'после удаления конфигурации browserify-shim? По сути, я хочу продолжать реагировать как внешнюю зависимость, но browserify, похоже, не понимает, как создать пакет и сохранить React внешним. Это может или не может быть, потому что модуль, который я включаю в мою точку входа browserify, реагирует как зависимость.
dmarr

FWIW, удаление реакции из конфигурации browserify-shim и разрешение браузеру примирить зависимость обычно все еще приводит к проблеме OP.
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.