reactjs ให้ข้อผิดพลาด Uncaught TypeError: การแสดงออกที่ยอดเยี่ยมจะต้องเป็นโมฆะหรือฟังก์ชั่นไม่ได้ไม่ได้กำหนด


256

ฉันใช้ reactjs

เมื่อฉันเรียกใช้รหัสด้านล่างเบราว์เซอร์กล่าวว่า:

Uncaught TypeError: Super expression ต้องเป็น Null หรือฟังก์ชั่นโดยไม่ได้กำหนด

คำแนะนำใด ๆ ที่เป็นสิ่งที่ผิดจะได้รับการชื่นชม

บรรทัดแรกที่ใช้ในการรวบรวมรหัส:

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)
Kevin Suttle

12
@Kevin เพียงต้องการใช้ถ้อยคำใหม่โดยทั่วไปหากคุณมีการพิมพ์ผิดที่ไหนสักแห่งในกรณีของฉันมันเป็นComponentsแทนComponent :) ความคิดเห็นของคุณช่วย BTW
P-RAD

ปัญหาของฉันคือฉันไม่ได้ส่งออกชั้นเรียนตอนท้ายไฟล์ ...
R01010010

2
ฉันทำ React.Components (พหูพจน์) ทางขวาคือ React.Component (เอกพจน์) โอ้ดี ... ฉันคิดถึงมันได้อย่างไร ...
Ismael

5
@Kevin Suttle ความคิดเห็นของคุณมีประโยชน์มากกว่าคำตอบจริง ๆ
Mick Jones

คำตอบ:


325

ชื่อคลาส

ประการแรกหากคุณมั่นใจว่าคุณกำลังขยายจากคลาสที่มีชื่ออย่างถูกต้องเช่นReact.Componentไม่ใช่ React.component หรือ React.createCreonComponent คุณอาจต้องอัพเกรดเวอร์ชั่น React ของคุณ ดูคำตอบด้านล่างสำหรับข้อมูลเพิ่มเติมเกี่ยวกับชั้นเรียนที่จะขยายออกไป

อัพเกรดการตอบสนอง

ตอบสนองได้รับการสนับสนุนเฉพาะการเรียน ES6 สไตล์ตั้งแต่รุ่น 0.13.0 (ดูโพสต์บล็อกของพวกเขาอย่างเป็นทางการเกี่ยวกับการแนะนำการสนับสนุนที่นี่

ก่อนหน้านั้นเมื่อใช้:

class HelloMessage extends React.Component

คุณกำลังพยายามที่จะใช้คำหลัก ES6 ( extends) เพื่อ subclass จากชั้นเรียนซึ่งไม่ได้กำหนดโดยใช้ classES6 นี่อาจเป็นเหตุผลว่าทำไมคุณถึงมีพฤติกรรมแปลก ๆ พร้อมsuperคำจำกัดความเป็นต้น

ดังนั้นใช่TL; DR - อัปเดตเป็น React v0.13.x

หนังสือเวียน

สิ่งนี้สามารถเกิดขึ้นได้หากคุณมีโครงสร้างการนำเข้าแบบวงกลม โมดูลหนึ่งนำเข้าอีกโมดูลหนึ่งและอีกทางหนึ่ง ในกรณีนี้คุณเพียงแค่ต้อง refactor รหัสของคุณเพื่อหลีกเลี่ยงมัน ข้อมูลเพิ่มเติม


202
สำหรับทุกคนที่มีปัญหานี้ แต่การอัพเดท React ไม่ใช่การแก้ไข - เลื่อนไปที่คำตอบอื่น ๆ ต่อไปอาจเป็นคำที่พิมพ์ผิดง่าย ในกรณีของฉันมันเป็นคำจำกัดความของคลาสที่ใช้React.componentแทนReact.Component
Christian Benke

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
ส่วนประกอบทุน 'C'! #facepalm
David

127

ซึ่งหมายความว่าคุณต้องการสิ่ง subclass ซึ่งควรจะแต่Class undefinedเหตุผลอาจเป็น:

  • พิมพ์ผิดClass extends ...ดังนั้นคุณจึงขยายตัวแปรที่ไม่ได้กำหนด
  • พิมพ์ผิดimport ... fromคุณจึงนำเข้าundefinedจากโมดูล
  • โมดูลอ้างอิงไม่มีค่าที่คุณต้องการนำเข้า (เช่นโมดูลล้าสมัย - กรณีที่มีการตอบสนอง) ดังนั้นคุณจึงนำเข้าค่าที่ไม่มีอยู่ ( undefined)
  • พิมพ์ผิดในexport ...คำสั่งโมดูลอ้างอิงดังนั้นจึงส่งออกตัวแปรที่ไม่ได้กำหนด
  • โมดูลที่อ้างถึงไม่มีexportคำสั่งเลยดังนั้นมันจึงส่งออกเพียงอย่างเดียวundefined

23
ในกรณีของฉันมันเป็นตัวพิมพ์เล็กของ Component ใน React.Component
สถิติการเรียนรู้ตามตัวอย่าง

3
ในกรณีของฉันมันเป็นคลาสที่เขียนด้วยตนเองไม่ได้นำเข้าอย่างถูกต้อง ฉันถูกนำเข้าชั้นเรียนเริ่มต้นที่ส่งออกผ่านทางแทนimport {Foo} from 'bar' import Foo from 'bar'โหวตขึ้นดังนั้น
xtra

4
อย่าทำเช่นนี้: class Thing extends React.Component() {- ฉันต้องลบ()
activedecay

ในกรณีของฉันข้อผิดพลาดนี้เกิดจากการสร้างการอ้างอิงแบบวงกลมโดยไม่ตั้งใจจากสิ่งที่ฉันนำเข้า (คลาสที่ฉันต้องการขยายไปยังคลาสย่อย) ในฟังก์ชันการแสดงผลส่วนประกอบของฉัน เมื่อฉันพยายามที่จะดำเนินการ / แสดงผล subclass ตั้งแต่ superClass ไม่ได้สร้างขึ้น แต่ก็ยังไม่ได้กำหนด
Leon

^ เกิดจากการอ้างอิงแบบวงกลมสำหรับฉันเช่นกัน
Cailen

90

นอกจากนี้ยังอาจเกิดจากข้อผิดพลาดการพิมพ์ผิดดังนั้นแทนที่จะใช้ตัวพิมพ์Componentใหญ่ C คุณจะcomponentมีตัวอักษร c ต่ำกว่าตัวอย่างเช่น:

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

หมายเหตุ: แหล่งที่มาของข้อผิดพลาดนี้อาจเป็นเพราะมีReactและเราคิดว่าสิ่งที่เกิดขึ้นต่อไปโดยอัตโนมัติควรเป็นวิธีการตอบสนองหรือคุณสมบัติที่เริ่มต้นด้วยตัวอักษรตัวพิมพ์เล็ก แต่ในความเป็นจริงมันเป็นClassอื่น( Component) .


2
ฮะแปลกข้อผิดพลาดนี้ไม่ได้ถูกจับในระหว่างขั้นตอนการสร้าง webpack แต่มันจะปรากฏขึ้นในเวลาทำงาน
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
มันใช้งานได้ในกรณีของฉัน! เอกสารที่ให้ไว้ในเว็บไซต์ที่มีปฏิกิริยาตอบสนองมีตัวอย่างบั๊กกี้นี้ :)
38411 theusual

ขอบคุณชิ้นส่วนควรนำเข้าจาก 'react'
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)
Pierre Maoui

1
ฉันยังได้รับนี้ แต่สำหรับการพิมพ์ตัวอักษรตัวแรกของส่วนประกอบ - ... ขยาย React.component {}
Ivan Topić

5

ตรวจสอบคลาสที่คุณมีอยู่จริง ๆ แล้วมีวิธีการปฏิเสธไม่กี่วิธีซึ่งอาจเป็นข้อผิดพลาด Typo '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 ชิ้นส่วนและแฮชที่มี Uglification โดย 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;
      },
    }),
  ],
}

ข้อมูลเพิ่มเติม


สิ่งนี้แก้ไขปัญหาให้ฉันได้อย่างแน่นอนอย่างไรก็ตามฉันสามารถระบุผู้กระทำผิดได้และในที่สุดฉันก็สามารถใช้การอัปเดตได้ ดูคำตอบของฉัน - ตอบสนองทำให้ตาพร่า
Erez Cohen

ฉัน จำกัด ให้แคบลงไปเป็นปลั๊กอินของผู้ดัดแปลงท้ายที่สุดการเปลี่ยนปฏิกิริยาสคริปต์เป็นเวอร์ชัน 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

ไม่ถูกต้องสำหรับคำตอบนี้ แต่สำหรับคนอื่นที่มีข้อผิดพลาดเดียวกันความผิดพลาดโง่ ๆ ของฉันก็อาจช่วยได้

โง่ปัญหาของฉันคือการใช้สัญกรณ์ฟังก์ชั่นโดยรวม () ดังต่อไปนี้ชื่อชั้น

ตรวจสอบให้แน่ใจว่าไวยากรณ์ของคุณถูกต้อง และคุณได้นำเข้าและส่งออกส่วนประกอบ / โมดูลภายนอกด้วยชื่อและพา ธ ที่ถูกต้อง

เทมเพลตนี้ควรใช้งานได้ดีถ้าคุณติดตั้ง react รุ่นใหม่แล้ว:

import React, { Component } from 'react'

class ExampleClass extends Component {

    render(){
        return(
            <div>

            </div>
        )
    }
}

export default ExampleClass 

3

เงื่อนไขของฉัน

  • สร้าง-React-App
  • React-scripts v3.2
  • โปรแกรมแก้ไขข้อความที่สมบูรณ์Froala v3.1
  • โหมดการพัฒนาทำงานได้ดี
  • โครงสร้างการผลิตถูกทำลายด้วยข้อผิดพลาดที่กล่าวถึงในคำถาม

วิธีแก้ไขปัญหาของฉัน

ปรับลดรุ่น Froala เป็น v3.0

มีบางสิ่งใน v3.1 ที่สร้างกระบวนการสร้างแอป React ของเราขึ้นมา

อัปเดต: ใช้สคริปต์การตอบสนอง v3.3

เราค้นพบว่ามีปัญหาระหว่าง React Scripts 3.2 และ Froala 3.1

การอัพเดทเป็น React Scripts v3.3 ทำให้เราสามารถอัพเกรดเป็น Froala 3.1 ได้


1
ผมรักคุณ. ฉันอยากเจอคุณและจูบเท้าของคุณ !!!!!!!!!!!!!!!!!!!!!!!!!!!!! (ฝันร้ายเหนือกว่าทั้งหมด)
GaddMaster

ฉันไม่ได้ใช้แอป create react แต่เจอปัญหาเดียวกันกับ prod with froala 3.1 คุณช่วยอธิบายปัญหาที่นี่ได้อย่างไร
Karan Jariwala

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 ดูเหมือนชัดเจนว่า OP ไม่ยอมรับข้อผิดพลาดนี้เนื่องจากพวกเขาได้รวมฟอร์มที่ถูกต้องไว้ในคำถามแล้ว คุณได้รับข้อผิดพลาดเหมือนกับ OP แต่มีสาเหตุอื่นหรือไม่?
Eduardo

ใช่ฉันได้รับข้อผิดพลาดเดียวกับ OP แต่ฉันพบว่าสาเหตุนั้นแตกต่างกันและหวังว่าสิ่งนี้จะช่วยผู้อื่นได้
Kush Gautam

2

อาจมีแพ็คเกจของบุคคลที่สามที่ทำให้เกิดปัญหานี้ ในกรณีของเรามันก็ตอบสนอง-ทำให้ตาพร่า เรามีการตั้งค่าที่คล้ายกับของ @steine ​​( ดูคำตอบนี้ด้านบน )

เพื่อค้นหาแพ็คเกจที่มีปัญหาฉันใช้งาน webpack build ในเครื่องด้วยโหมดการผลิตและทำให้สามารถค้นหาแพ็คเกจที่มีปัญหาในการติดตามสแต็ก ดังนั้นสำหรับเรานี่เป็นวิธีแก้ปัญหาและฉันก็สามารถรักษาความอัปลักษณ์ได้


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
ถ้าคุณกำลังใช้รุ่นล่าสุดของการตอบสนอง (16.8.6 ณ ขณะนี้)


0

หากคุณได้รับข้อผิดพลาดนี้และกำลังใช้Browserifyและbrowserify-shim (เช่นในงาน Grunt) คุณอาจประสบกับช่วงเวลาที่โง่เง่าเหมือนที่ฉันเคยทำในที่ที่คุณตั้งใจบอกbrowserify-shimให้ทำปฏิกิริยาเป็นส่วนหนึ่งของเนมสเปซส่วนกลางแล้ว (ตัวอย่างเช่น โหลดจาก CDN)

หากคุณต้องการให้ Browserify รวม React เป็นส่วนหนึ่งของการแปลงไม่ใช่ไฟล์แยกให้แน่ใจว่าบรรทัด"react": "global:React"นั้นไม่ปรากฏใน"browserify-shim"ส่วนในpackages.jsonไฟล์ของคุณ


คุณจะหลีกเลี่ยงUncaught Error: Cannot find module 'react'หลังจากลบการกำหนดค่า browserify-shim ได้อย่างไร โดยทั่วไปฉันต้องการให้การตอบสนองเป็นการพึ่งพาภายนอก แต่เบราว์เซอร์ดูเหมือนจะไม่เข้าใจวิธีการสร้างมัดและเก็บการตอบสนองภายนอก สิ่งนี้อาจเป็นไปได้หรือไม่อาจเป็นเพราะโมดูลที่ฉันรวมอยู่ในจุดเข้าใช้งาน browserify ของฉันนั้นมีปฏิกิริยาเหมือนการพึ่งพา
59

FWIW การลบการตอบสนองจากการกำหนดค่า browserify-shim และการให้เบราว์เซอร์กระทบยอดการพึ่งพาตามปกติยังคงส่งผลให้เกิดปัญหาของ OP
59

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 ที่แก้ไขข้อผิดพลาดนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.