React JSX dosyası "Tanımlanmamış 'createElement' özelliği okunamıyor" hatası veriyor


107

Çalıştırdığım bir test_stuff.js dosyam var npm test

Hemen hemen şuna benziyor:

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

Maalesef hatayı alıyorum

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

Bu ne anlama geliyor? React'i 'react'ten başarıyla içe aktarıyorum, öyleyse neden React tanımsız olsun? Bu _react.React, her ne anlama geliyorsa ...

Yanıtlar:


210

React'i içe aktarmak için İçe import React from 'react'aktardığınız şey o modül veya dosyada varsayılan dışa aktarma olmadığında parantez eklersiniz. Tepki verme durumunda, varsayılan dışa aktarmadır.

Bu, onları nasıl tanımladığınıza bağlı olarak diğer ithalatlarınız için geçerli olabilir.


19
Henüz neden emin değilim ama benim için öyleydiimport * as React from "react"
Clintm

8
Teknik olarak, import React from 'react'React varsayılan dışa aktarma olmadığı için geçerli değildir, ancak ES6'nın babel ile birlikte kullanılması nedeniyle çalışmaktadır. Belki babel yapılandırmanız farklıdır ve sizi doğru sözdizimini kullanmaya zorluyor import * as React from 'react'. Daha fazla bilgi için: github.com/DefinitelyTyped/DefinitelyTyped/issues/5128
Kafo

Söylemeyi unuttuğum bir diğer önemli şey de JSX'in React'in çalışması için kapsamda olmasını gerektirmesidir. Ancak, Component ve belki de diğer adlandırılmış dışa aktarmalar dışında React'e gerçekten ihtiyacınız yoktur. Belki gelecekte React'i içe aktarmayacaksınız.
Kafo

1
Expo ile react-native kullanıyorum ve babel ön babel-preset-expo ayarım github.com/expo/babel-preset-expo/blob/master/index.js
Clintm

2
Daktilo kullanılıyorsa, içe aktarma stili de esModuleInteroptsconfig içindeki ayarından etkilenecektir . Tsconfig test dosyalarına uygulanmalıdır (kontrol includeve files).
Matthias

38
import React, { Component } from 'react'

Bu benim için çalıştı. Yine de bu sorunun benim versiyonumu neden düzelttiğinden emin değilim. Dolayısıyla, bu soruna rastlayan biriyseniz ve başlangıç ​​şablonunuz olarak create-react-app'i kullanıyorsanız, React'i içe aktarmanın bu yolu işe yarayacaktır. (Ekim '18 itibariyle, lol)


Bu, notu, useEffect, useState'i içeri aktarmaya çalışırken tepki vermenin yanı sıra yaşadığım sorun oldu. Başlangıçta "Tanımlanmamış özellik 'notu' okunamıyor" hatası görüldü, ancak bu
sorunu çözdü

Bu benim için de düzeltildi (ancak Bileşen yerine useState'i içe aktardım). Şimdi orijinal, hatalı import { React, useState } from 'react';
JosFabre

1
@JosFabre hatalıydı çünkü sé başına varsayılan olmayan olarak 'react'dışa aktarmıyor React. Ancak export useState, export Componentvb
c4k

18

ReactJS'yi TypeScript ile çalışanlar için.

import * as React from 'react';

3
Bu benim sorunumdu. Teşekkürler!
Joseph Fehrman

2
Bu neden gerekli? Jest çalıştırırken kod tabanımın her yerinde bu hatayı alıyorum.
Nate Glenn

İthalatı "yeniden güzel" yapmanın bir yolu var. Tsconfig.json dosyanıza "esModuleInterop: true" ekleyin. Ve "React'i 'react'ten içe aktarın" keyfini çıkarın! - Shulyk Volodymyr
Shulyk Volodymyr

3

Bu hata, dikkatsizlik yüzünden başıma geldi. Aslında

import React from 'react';

Parantezler, aşağıdaki gibi adlandırılmış dışa aktarmalar içindir:

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

Yeni bir sorunuz varsa, lütfen Soru Sor düğmesine tıklayarak sorun . Bağlam sağlamaya yardımcı oluyorsa bu soruya bir bağlantı ekleyin. - Şu kaynaktan
MartenCatcher

0

Değiştir: {React} ' i ' react'ten içe aktararak 'react'ten React'i içe aktarın çünkü React varsayılan bir dışa aktarmadır ve varsayılan dışa aktarmalar için küme parantezlerine ihtiyacınız yoktur.


0

React'ten birden fazla sınıfı içe aktarmanız gerekirse, React dışında onlar için bir takma adınız olabilir. Gibi bir şey,

import React, * as react from 'react';

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.