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

187

Я использую реакцию.

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

Uncaught TypeError: выражение Super должно иметь значение null или функцию, а не undefined

Любые намеки на все, что не так, будут оценены.

Сначала строка, используемая для компиляции кода:

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

UPDATE: После сжигания в адском огне в течение трех дней по этой проблеме я обнаружил, что не использовал последнюю версию реакции.

Установить глобально:

sudo npm install -g [email protected]

установить локально:

npm install [email protected]

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

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

Надеюсь, это спасет кого-то еще три дня драгоценной жизни.

  • 95
    Начиная с 0.14.8, вы все равно можете получить это, если сделаете что-то вроде extends React.component (строчная буква c ).
  • 11
    @Kevin просто хочу перефразировать, в основном, если у вас где-то есть опечатка, в моем случае это были Components вместо Component :). Ваш комментарий помог КСТАТИ
Показать ещё 7 комментариев
Теги:
ecmascript-6

35 ответов

237
Лучший ответ

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

Во-первых, если вы уверены, что вы расширяетесь от правильно названного класса, например. 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.

Циркулярные зависимости

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

  • 183
    Для всех остальных, у которых есть эта проблема, но обновление React не является исправлением - прокрутите дальше вниз к другим ответам, это может быть простая опечатка. В моем случае это было определение класса с использованием React.component вместо React.Component
  • 1
    К вашему сведению, старый класс может быть расширен с помощью extends . Попробуйте это var x = function(){}; class y extends x {}
Показать ещё 9 комментариев
119

Это означает, что вы хотите, чтобы подкласс чего-то, что должно быть Class, но есть undefined. Причины могут быть следующими:

  • typo in Class extends ..., поэтому вы расширяете переменную undefined
  • typo in import ... from, поэтому вы импортируете undefined из модуля
  • ссылочный модуль не содержит значения, вы хотите импортировать (например, устаревший модуль - case with React), поэтому вы импортируете не существующее значение (undefined)
  • typo в ссылочном модуле export ..., поэтому он экспортирует переменную undefined
  • отсутствует модуль export отсутствует, поэтому он экспортирует только undefined
  • 22
    В моем случае это была строчная буква компонента в React.Component.
  • 3
    В моем случае это был самописный класс, импортированный неправильно. Я импортировал экспортированный класс по умолчанию через import {Foo} from 'bar' вместо import Foo from 'bar' . Поэтому проголосовал.
Показать ещё 7 комментариев
86

Он также может быть вызван ошибкой typo, поэтому вместо Component с капиталом C у вас есть Component с более низким c, например:

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

Примечание: Источником этой ошибки может быть, потому что существует React, и мы думаем автоматически, что будет дальше, должен быть метод реагирования или свойство, начинающееся с строчной буквы, но на самом деле это еще один класс (Component), который должен начинаться с буквы основного письма.

  • 2
    да, странно, что эта ошибка не обнаруживается на этапе сборки веб-пакета, но она будет отображаться во время выполнения.
24

В моем случае, с реакцией-native, ошибка заключалась в том, что у меня был

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';
  • 0
    Это сработало в моем случае! Документация, представленная на сайте Reaction-native, содержит этот пример ошибки :)
14

Я испытал это при отсутствии инструкции экспорта для класса JSX.

Например:

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

Я видел эту ошибку, когда у вас есть круговая зависимость.

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

Для любых других лиц, которые могут разработать эту проблему. Вы также можете проверить, что метод component в React.Component является заглавным. У меня была та же проблема, и что вызвало это, я написал:

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

Я изменил его на

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

и все сработало хорошо

9

Вы также можете получить это, если вы пытаетесь выполнить React.Component с ошибочным () в определении вашего класса.

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

Что мне иногда удается сделать, когда я перехожу из функционального компонента без состояния в класс.

  • 0
    Это было проблемой для меня. очень глупо. большое спасибо!
6

Я получил это, когда у меня была опечатка на моем импортировании:

import {Comonent} from 'react';
  • 0
    Я также получил это с расширяет React.Components вместо React.Component (нет).
  • 1
    Я также получил это, но для ввода маленькой первой буквы компонента - ... extends React.component {}
5

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

Удачи!!

  • 0
    В моем случае я использовал React.component вместо React.Component (обратите внимание на React.Component "C")
4

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

Я не верю, что на момент написания это официально поддерживается babel и бросает typescript в спину - однако я видел, что он используется во многих проектах и ​​определенно удобен.

Однако при использовании в сочетании с наследованием, похоже, возникает ошибка, представленная в вопросе выше.

Простым решением является то, что для модулей, которые действуют как родители, необходимо импортировать напрямую, а не через индексный индекс удобства.

./SRC/компоненты/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/компоненты/ком-1/Com1.js

import { Com2, Com3 } from '../index';

// This works fine
class Com1 {        
    render() {
        return (
            <div>
                <Com2 {...things} />
                <Com3 {...things} />
            </div>
        );
    }
}

./SRC/компоненты/ком-3/Com3.js

import { Parent } from '../index';

// This does _not_ work
class Com3 extends Parent {        
}

./SRC/компоненты/ком-3/Com3.js

import Parent from '../parent/Parent';

// This does work
class Com3 extends Parent {        
}
  • 0
    Это помогло мне понять, что я сделал не так. Случайно завернул имя компонента в {} в моем операторе импорта. Тонкая разница. Может быть трудно обнаружить эту ошибку.
3

Это сработало для меня:

import React, {Component} from 'react';
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
2

Я написал

React.component

вместо React.Component Это была моя проблема)) и искал это более получаса.

2

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

1

Посмотрите, если у вас есть ошибка опечатки в вашем импорте или поколении, это может быть просто так.

1

Я столкнулся с этой ошибкой при импорте компонента, например:

import React, { Components } from 'react';

вместо

import React, { Component } from 'react';
1

В моем случае я использовал:

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

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

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

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

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

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

import React, { Component } from 'react'

class ExampleClass extends Component {

    render(){
        return(
            <div>

            </div>
        )
    }
}

export default ExampleClass 
1

Использование Babel (5.8) Я получаю ту же ошибку, если попытаюсь использовать выражение export default в сочетании с некоторым другим export:

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

Если вы работаете в режиме dev dev, остановитесь и перестройте его. Я преобразовал модуль ES6 в React Component, и он работал только после перестройки (против сборки часов).

0

Для меня я забыл default. Поэтому я написал export class MyComponent вместо класса export default class MyComponent

0

В моем случае оказалось, что React <15.3.0 не включает React.PureComponent. Так что код вроде:

class MyClass extends React.PureComponent {
    //...
}

не сработает.

0

У меня была эта проблема, потому что мои версии react и react-dom после слияния не совпадали.

Я исправил это, вручную введя номер npm install версии и снова запустив npm install.

0

В моем случае я использовал модуль npm с одноранговыми зависимостями. Ошибка была вызвана неправильной "внешней" конфигурацией в конфигурации модуля webpack:

  externals: {
    react: 'react',
    react: 'prop-types',
  },

Так должно быть:

externals: {
    react: 'react',
    ['prop-types']: 'prop-types',
  },
0

Другой случай, связанный с Expo/реакции-native с машинописным шрифтом: иногда, когда вы перекомпилируете файлы машинописного текста в середине упаковки, упаковщик реагирует на потерю.

Единственный способ снова запустить мое приложение - очистить кеш; если вы используете экспо-клик, вы можете нажать клавишу R (это верхний регистр 'R'); это восстановит весь пакет. Иногда переключение в режим разработки также помогает....

0

В моем случае я исправил эту ошибку, изменив export default class yourComponent extends React.Component() {} чтобы export default class yourComponent extends React.Component {}. Да, удалите скобки () исправили ошибку.

0

Вот один ответ:

import React, { Component } from 'react'; // NOT 'react-dom'
  • 0
    именно моя опечатка
0

В моем случае это было изменение React.Element на React.Component, которое исправило эту ошибку.

0

Для тех, кто использует react-native:

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

может выдать эту ошибку.

Принимая во внимание, что ссылки react напрямую, это более стабильный путь:

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

Это также может произойти, если у вас есть рекурсивный импорт.

i.e Для компонента ComponentA для компонентов ComponentB и ComponentB требуется ComponentA.

0

Случилось также, когда я использовал это:

class App extends React.Component(){

}

Вместо правильного:

class App extends React.Component{

}

Обратите внимание: -() в первом, что является основной причиной этой проблемы

0

Это также может произойти, если вы использовали require вместо import в своем коде.

0

Если вы получаете эту ошибку и используете Browserify и browserify-shim (например, в задаче Grunt), возможно, вы столкнулись с тупым моментом, как я сделал, где вы непреднамеренно сказали browserify-shim рассматривать React как уже часть глобального пространства имен (например, загружаемого из CDN).

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

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

в моем случае пишу

class Name extends React.Compoment//вместо класса Name extends React.Component

Ещё вопросы

Сообщество Overcoder
Наверх
Меню