Reaguj na plik JSX podając błąd „Nie można odczytać właściwości„ createElement ”o wartości undefined”

102

Mam plik test_stuff.js, z którym pracuję npm test

Wygląda to mniej więcej tak:

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

Niestety pojawia się błąd

/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)

Co to znaczy? Importuję Reacta z polecenia „reaguj”, więc dlaczego React miałby być niezdefiniowany? To jest _react. React, cokolwiek to znaczy ...

Jakiś facet
źródło

Odpowiedzi:

196

Aby zaimportować Reacta, należy import React from 'react'dodać nawiasy, gdy importowany element nie jest domyślnym eksportem w tym module lub pliku. W przypadku reakcji jest to domyślny eksport.

Może to dotyczyć innych importów, w zależności od tego, jak je zdefiniowałeś.

Kafo
źródło
18
Nie jestem pewien, dlaczego jeszcze, ale dla mnie było toimport * as React from "react"
Clintm
8
Technicznie rzecz biorąc, import React from 'react'nie jest poprawne, ponieważ React nie jest domyślnym eksportem, ale działa dzięki używaniu ES6 w połączeniu z babel. Może twoja konfiguracja babel jest inna, co zmusza cię do użycia poprawnej prawidłowej składni, którą jest import * as React from 'react'. Więcej informacji: github.com/DefinitelyTyped/DefinitelyTyped/issues/5128
Kafo
Kolejną ważną rzeczą, o której zapomniałem wspomnieć, jest to, że JSX wymaga, aby React znajdował się w zakresie do działania. Jednak tak naprawdę nie potrzebujesz React oprócz Component i być może innych nazwanych eksportów. Może w przyszłości nie będziesz importować Reacta.
Kafo
1
Używam babel-preset-expo React
Clintm
2
Jeśli używasz skryptu maszynowego, na styl importu wpłynie również ustawienie esModuleInteropw pliku tsconfig. Tsconfig musi mieć zastosowanie do plików testowych (sprawdź includei files).
Matthias
33
import React, { Component } from 'react'

To zadziałało dla mnie. Nie jestem jednak pewien, dlaczego naprawiło to moją wersję tego problemu. Więc jeśli jesteś kimś, kto natknął się na ten problem i używasz aplikacji create-react-jako swojego początkowego schematu, ten sposób importowania React załatwi sprawę. (od października '18, lol)

TJ Allen
źródło
To był problem, który miałem, próbując zaimportować notatki, useEffect, useState, oprócz reagowania. Pierwotnie zobaczyłem błąd „Nie można odczytać notatki o właściwościach o wartości undefined”, ale rozwiązało to
problem
Naprawiło to również dla mnie (chociaż zamiast komponentu importuję useState). Jestem teraz bardzo ciekawy różnicy z moim oryginalnym, wadliwym import { React, useState } from 'react';
JosFabre
1
@JosFabre to było błędne, ponieważ 'react'nie eksportuje Reactjako niedomyślne per se. Jednak export useState, export Componentitp
c4k
17

Dla tych, którzy pracują w ReactJS z TypeScript.

import * as React from 'react';
appiconhero.co
źródło
3
To był mój problem. Dzięki!
Joseph Fehrman
2
Dlaczego jest to konieczne? Otrzymuję ten błąd w całej mojej bazie kodu, gdy uruchamiam żart.
Nate Glenn
Istnieje sposób, aby import był „znowu piękny”. Dodaj „esModuleInterop: true” do swojego tsconfig.json. I ciesz się swoim „importem Reacta z 'reaguj'”! - Shulyk Volodymyr
Shulyk Volodymyr
0

Zmiana: importuj {React} z „reaguj”, aby importować Reaguj z „reaguj” Ponieważ React jest domyślnym eksportem i nie potrzebujesz nawiasów klamrowych do żadnego domyślnego eksportu.

Saran MS
źródło
0

Jeśli chcesz zaimportować wiele klas z 'React', możesz mieć dla nich alias z wyjątkiem React. Coś jak,

import React, * as react from 'react';
Sasi Kumar M
źródło
0

Ten błąd wystąpił mi z powodu nieostrożności. Właściwie to

import React from 'react';

Nawiasy dotyczą nazwanych eksportów, takich jak ten:

import React, { useState, useEffect } from 'react';
Vimal Kurien Sam
źródło
Jeśli masz nowe pytanie, zadaj je, klikając przycisk Zadaj pytanie . Dołącz link do tego pytania, jeśli pomaga to w dostarczeniu kontekstu. - Z recenzji
MartenCatcher
0

React jest eksportowany domyślnie w tym module, nie ma potrzeby {}.

Aggestor Mhl
źródło