React JSX 파일에서“Undefined의 'createElement'속성을 읽을 수 없습니다.


102

실행중인 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. React, 그게 무슨 뜻이든간에 ...

답변:


196

React를 가져 오려면 가져 import React from 'react'오는 것이 해당 모듈이나 파일의 기본 내보내기가 아닌 경우 대괄호를 추가합니다. 반응의 경우 기본 내보내기입니다.

정의한 방법에 따라 다른 가져 오기에 적용될 수 있습니다.


18
아직 이유는 import * as React from "react"
모르겠지만

8
기술적으로 말하면 import React from 'react'React가 기본 내보내기가 아니기 때문에 유효하지 않지만 바벨과 함께 ES6를 사용하기 때문에 작동합니다. 바벨 구성이 다르기 때문에 올바른 유효한 구문을 사용해야 할 수도 있습니다 import * as React from 'react'. 추가 정보 : github.com/DefinitelyTyped/DefinitelyTyped/issues/5128
Kafo

내가 잊은 또 다른 중요한 점은 JSX가 작동하려면 React가 범위 내에 있어야한다는 것입니다. 그러나 Component와 다른 이름의 내보내기 외에 React가 실제로 필요하지는 않습니다. 아마도 미래에는 React를 가져 오지 않을 것입니다.
Kafo

1
나는 expo와 함께 react-native를 사용하고 있으며 내 바벨 사전 설정은 babel-preset-expo github.com/expo/babel-preset-expo/blob/master/index.js
Clintm

2
typescript를 사용하는 경우 가져 오기 스타일도 esModuleInteroptsconfig 의 설정에 영향을받습니다 . tsconfig는 테스트 파일 (check includefiles)에 적용되어야합니다 .
Matthias

33
import React, { Component } from 'react'

이것은 나를 위해 일했습니다. 그래도이 문제의 내 버전이 왜 수정되었는지 모르겠습니다. 따라서이 문제를 우연히 발견하고 create-react-app을 시작 상용구로 사용하는 경우 React를 가져 오는이 방법이 트릭을 수행합니다. ('18 년 10 월 현재 웃음)


이것은 메모, useEffect, useState를 가져올 때 반응하는 것 외에도 내가 가지고 있던 문제였습니다. 원래 "Undefined의 'memo'속성을 읽을 수 없습니다"라는 오류가 발생했지만 이로 인해 수정되었습니다
SeanMC

이것은 나에게도 수정되었습니다 (구성 요소 대신 useState를 가져옵니다). 나는 이제 내 원래의 결함과의 차이점에 대해 매우 궁금합니다 import { React, useState } from 'react'.
JosFabre 19

1
@JosFabre sé 당 기본값 'react'이 아닌 것으로 내 보내지 않기 때문에 결함이 React있습니다. 그러나 그것 export useState, export Component
c4k

17

TypeScript로 ReactJS를 사용하는 사람들을 위해.

import * as React from 'react';

3
이것은 내 문제였습니다. 감사!
Joseph Fehrman

2
왜 이것이 필요한가요? jest를 실행할 때 코드베이스 전체 에이 오류가 발생합니다.
Nate Glenn

수입품을 "다시 아름답게"만드는 방법이 있습니다. tsconfig.json에 "esModuleInterop : true"를 추가하십시오. 그리고 " 'react'에서 React 가져 오기"를 즐기십시오! – Shulyk Volodymyr
Shulyk Volodymyr 2011

1

이 오류는 부주의로 인해 발생했습니다. 실제로

import React from 'react';

대괄호는 다음과 같이 명명 된 내보내기를위한 것입니다.

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

새로운 질문이 있으면 질문하기 버튼 을 클릭하여 질문하십시오 . 컨텍스트를 제공하는 데 도움이되는 경우이 질문에 대한 링크를 포함하십시오. - 리뷰에서
MartenCatcher

0

변경 : '반응'에서 가져 오기 {반작용}수입 '반응'에서 반작용 기본 수출이다 반작용 때문에 당신이 어떤 기본 수출 중괄호가 필요하지 않습니다.


0

'react'에서 여러 클래스를 가져와야하는 경우 React를 제외하고 별칭을 가질 수 있습니다. 같은 것,

import React, * as react from 'react';

0

React 기본적으로 해당 모듈에서 내보내지며 {}이 필요하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.