ตอบสนองไฟล์ JSX ที่ให้ข้อผิดพลาด "ไม่สามารถอ่านคุณสมบัติ 'createElement' ของไม่ได้กำหนด"


110

ฉันมีไฟล์ test_stuff.js ที่ใช้งานอยู่ npm test

ดูเหมือนว่า:

import { assert } from 'assert';
import { MyProvider } from '../src/index';
import { React } from 'react';

const myProvider = (
  <MyProvider>
  </MyProvider>
);

describe('Array', function() {
  describe('#indexOf()', function() {
    it('should return -1 when the value is not present', function() {
      assert.equal(-1, [1,2,3].indexOf(4));
    });
  });
});

ขออภัยฉันได้รับข้อผิดพลาด

/Users/me/projects/myproj/test/test_stuff.js:11
var myProvider = _react.React.createElement(_index.MyProvider, null);
                             ^

TypeError: Cannot read property 'createElement' of undefined
    at Object.<anonymous> (/Users/me/projects/myproj/test/test_stuff.js:7:7)

นั่นหมายความว่าอย่างไร? ฉันกำลังนำเข้า React จาก 'react' สำเร็จแล้วทำไม React ถึงไม่ได้กำหนด? มันคือ _react ปฏิกิริยาอะไรก็ตามที่หมายถึง ...

คำตอบ:


215

ในการนำเข้า React import React from 'react'คุณต้องเพิ่มวงเล็บเมื่อสิ่งที่คุณกำลังนำเข้าไม่ใช่การส่งออกเริ่มต้นในโมดูลหรือไฟล์นั้น ในกรณีที่ตอบสนองจะเป็นการส่งออกเริ่มต้น

ซึ่งอาจใช้กับการนำเข้าอื่น ๆ ของคุณขึ้นอยู่กับว่าคุณกำหนดไว้อย่างไร


19
ฉันไม่แน่ใจว่าทำไมถึงเป็นเช่นนั้น แต่สำหรับฉันแล้วimport * as React from "react"
Clintm

8
ในทางเทคนิคimport React from 'react'ไม่ถูกต้องเนื่องจาก React ไม่ใช่การส่งออกเริ่มต้น แต่ทำงานได้เนื่องจากใช้ ES6 ร่วมกับ babel บางทีการกำหนดค่า Babel import * as React from 'react'ของคุณจะแตกต่างกันบังคับให้คุณใช้ไวยากรณ์ที่ถูกต้องที่ถูกต้องซึ่งเป็น สำหรับข้อมูลเพิ่มเติม: github.com/DefininiteTyped/DefininiteTyped/issues/5128
Kafo

สิ่งสำคัญอีกอย่างที่ฉันลืมพูดถึงคือ JSX ต้องการให้ React อยู่ในขอบเขตการทำงาน อย่างไรก็ตามคุณไม่ต้องการ React จริงๆนอกจาก Component และอาจมีการส่งออกชื่ออื่น ๆ บางทีในอนาคตคุณจะไม่นำเข้า React
Kafo

1
ฉันใช้ react-native กับ expo และค่าที่ตั้งไว้ล่วงหน้าของ babel คือbabel-preset-expo github.com/expo/babel-preset-expo/blob/master/index.js
Clintm

3
หากใช้ typescript รูปแบบการนำเข้าจะได้รับผลกระทบจากการตั้งค่าesModuleInteropใน tsconfig tsconfig ต้องใช้กับไฟล์ทดสอบ (ตรวจสอบincludeและfiles)
Matthias

40
import React, { Component } from 'react'

สิ่งนี้ได้ผลสำหรับฉัน ฉันไม่แน่ใจว่าเหตุใดจึงแก้ไขปัญหานี้ในเวอร์ชันของฉัน ดังนั้นหากคุณเป็นคนที่ประสบปัญหานี้และคุณใช้ create-react-app เป็นต้นแบบเริ่มต้นวิธีการนำเข้า React นี้จะช่วยแก้เคล็ด (ณ ต.ค. 61 ฮ่า ๆ )


นี่เป็นปัญหาที่ฉันพบเมื่อพยายามนำเข้าบันทึกใช้ useEffect, useState นอกเหนือจากการตอบสนอง เดิมเห็นข้อผิดพลาด "ไม่สามารถอ่านคุณสมบัติ 'บันทึก' ของไม่ได้กำหนด" แต่สิ่งนี้ได้รับการแก้ไขแล้ว
SeanMC

สิ่งนี้แก้ไขให้ฉันด้วย (แม้ว่าจะเป็นส่วนประกอบที่ฉันนำเข้า useState) ตอนนี้ผมอยากรู้มากเกี่ยวกับความแตกต่างกับเดิมของฉันผิดพลาดimport { React, useState } from 'react';
JosFabre

1
@JosFabre มันผิดพลาดเพราะ'react'ไม่ได้ส่งออกReactเป็นค่าเริ่มต้นต่อsé อย่างไรก็ตามexport useState, export Componentฯลฯ
c4k

18

สำหรับผู้ที่ทำงาน ReactJS กับ TypeScript

import * as React from 'react';

3
นี่คือปัญหาของฉัน ขอบคุณ!
Joseph Fehrman

2
เหตุใดจึงจำเป็น ฉันได้รับข้อผิดพลาดนี้ทั่วทั้ง codebase เมื่อเรียกใช้ jest
Nate Glenn

มีวิธีทำให้นำเข้า "สวยอีกครั้ง". เพิ่ม "esModuleInterop: true" ใน tsconfig.json ของคุณ และเพลิดเพลินไปกับ "การนำเข้า React จาก 'react'" ของคุณ! - Shulyk Volodymyr
Shulyk Volodymyr

3

ข้อผิดพลาดนี้เกิดขึ้นกับฉันเนื่องจากความประมาท มันเป็นความจริง

import React from 'react';

วงเล็บมีไว้สำหรับการส่งออกที่ระบุชื่อเช่นนี้:

import React, { useState, useEffect } from 'react';

หากคุณมีคำถามใหม่โปรดขอได้โดยคลิกที่ถามคำถามปุ่ม ใส่ลิงก์ไปยังคำถามนี้หากช่วยให้บริบท - จากรีวิว
MartenCatcher

0

เปลี่ยน: นำเข้า {React} จาก 'react' เพื่อ นำเข้า React จาก 'react' เนื่องจาก React เป็นการส่งออกเริ่มต้นและคุณไม่จำเป็นต้องใช้วงเล็บปีกกาสำหรับการส่งออกเริ่มต้นใด ๆ


0

หากในกรณีที่คุณต้องการนำเข้าหลายคลาสจาก 'react' คุณสามารถมีนามแฝงสำหรับพวกเขายกเว้น React สิ่งที่ต้องการ,

import React, * as react from 'react';

0

React จะถูกส่งออกโดยค่าเริ่มต้นในโมดูลนั้นไม่จำเป็นต้องมี {}

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