Зреагуйте на файл JSX із помилкою "Не вдається прочитати властивість 'createElement' з undefined"


101

У мене є файл 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 із 'Reag', то чому React буде невизначеним? Це _react.React, що б це не означало ...

Відповіді:


195

Щоб імпортувати React, import React from 'react'ви додаєте дужки, коли те, що ви імпортуєте, не є типовим експортом у цьому модулі чи файлі. У разі реакції це експорт за замовчуванням.

Це може стосуватися інших ваших імпортів залежно від того, як ви їх визначили.


17
Я ще не впевнений, чому саме, але для мене це булоimport * as React from "react"
Клінтм

8
Технічно кажучи, import React from 'react'недійсний, оскільки React не є експортом за замовчуванням, але він працює завдяки використанню ES6 у поєднанні з babel. Можливо, ваша конфігурація Babel відрізняється, що змушує вас використовувати правильний дійсний синтаксис, який є import * as React from 'react'. Для отримання додаткової інформації: github.com/DefinitelyTyped/DefinitelyTyped/issues/5128
Кафо

Ще одна важлива річ, про яку я забув згадати, - це те, що JSX вимагає React для роботи. Однак вам насправді не потрібен React, крім Component та, можливо, інших іменованих експортів. Можливо, у майбутньому ви не будете імпортувати React.
Кафо

1
Я використовую рідну реакцію з expo, і мій пресет для babel - babel-preset-expo github.com/expo/babel-preset-expo/blob/master/index.js
Clintm

2
Якщо використовується машинопис, на стиль імпорту також впливатиме параметр esModuleInteropу tsconfig. Tsconfig повинен застосовуватися до тестових файлів (перевірити includeта files).
Матіас

32
import React, { Component } from 'react'

Це працювало для мене. Але я не впевнений, чому це виправило мою версію цієї проблеми. Отже, якщо ви хтось натрапив на цю проблему, і ви використовуєте create-response-app як початковий шаблон, такий спосіб імпортування React зробить свою справу. (станом на жовтень 18, ха-ха)


Це була проблема, з якою я стикався, намагаючись імпортувати пам’ятку, useEffect, useState, окрім того, щоб реагувати. Спочатку бачила помилку "Не вдається прочитати властивість" нагадування "про невизначене", але це виправило
SeanMC

Це виправлено і для мене (хоча замість Component я імпортую useState). Зараз мені дуже цікаво, чим відрізняється моя оригінальна, несправна import { React, useState } from 'react';
JosFabre

1
@JosFabre виявився несправним, оскільки 'react'не експортується Reactяк не за замовчуванням. Однак це export useState, export Componentтощо
c4k

17

Для тих, хто працює з ReactJS із TypeScript.

import * as React from 'react';

3
Це була моя проблема. Дякую!
Джозеф Ферман,

2
Навіщо це потрібно? Я отримую цю помилку у всій моїй базі коду під час запуску жарту.
Нейт Гленн,

Існує спосіб зробити імпорт "знову красивим". Додайте "esModuleInterop: true" до вашого tsconfig.json. І насолоджуйтесь вашим "імпортом React від" реагуйте ""! - Шулик Володимир
Шулик Володимир

0

Зміни: імпортуйте {React} з 'React' на імпорт React з 'React', оскільки React є експортом за замовчуванням, і вам не потрібні фігурні дужки для будь-якого експорту за замовчуванням.


0

Якщо у випадку, якщо вам потрібно імпортувати декілька класів з 'response', ви можете мати для них псевдонім, крім React. Щось на зразок,

import React, * as react from 'react';

0

Ця помилка сталася у мене через необережність. Це насправді

import React from 'react';

Дужки призначені для іменованого експорту, наприклад:

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

Якщо у вас є нове запитання, поставте його, натиснувши кнопку Задати питання . Додайте посилання на це запитання, якщо це допомагає надати контекст. - З огляду
MartenCatcher

0

React експортується за замовчуванням у цей модуль, не потрібно {}.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.