エラー「未定義のプロパティ 'createElement'を読み取れません」を示すJSXファイルに反応します


100

私が実行しているファイル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です。

回答:


194

React doをインポートimport React from 'react'するにはインポートするものがそのモジュールまたはファイルのデフォルトのエクスポートではない場合は、ブラケットを追加します。反応の場合、これがデフォルトのエクスポートです。

これは、それらをどのように定義したかに応じて、他のインポートに適用される場合があります。


17
理由はまだimport * as React from "react"
わかり

8
import React from 'react'Reactはデフォルトのエクスポートではないため、技術的にはは無効ですが、ES6をbabelと組み合わせて使用​​するために機能します。たぶんあなたのバベルの設定が異なるので、正しい有効な構文であるを使用する必要がありますimport * as React from 'react'。詳細:github.com/DefinitelyTyped/DefinitelyTyped/issues/5128
Kafo

私が言及するのを忘れていたもう1つの重要なことは、JSXが機能するためにはReactが範囲内にある必要があるということです。ただし、コンポーネント以外のReactや、その他の名前付きエクスポートは実際には必要ありません。おそらく将来的にはReactをインポートしないでしょう。
Kafo 2017

1
expoでreact-nativeを使用していて、私のbabelプリセットはbabel-preset-expo github.com/expo/babel-preset-expo/blob/master/index.js
Clintm

2
typescriptを使用する場合、インポートスタイルはesModuleInteroptsconfigのの設定によっても影響を受けます。tsconfigをテストファイルに適用する必要があります(チェックincludefiles)。
Matthias

32
import React, { Component } from 'react'

これでうまくいきました。ただし、なぜこの問題の私のバージョンが修正されたのかはわかりません。したがって、この問題に出くわした人で、create-react-appを開始ボイラープレートとして使用している場合は、この方法でReactをインポートするとうまくいきます。(18年10月現在、笑)


これは、反応に加えて、メモ、useEffect、useStateをインポートしようとしたときに発生していた問題でした。当初は「未定義のプロパティ 'メモ'を読み取れません」というエラーが表示されましたが、これにより修正されました
SeanMC

これで修正されました(コンポーネントの代わりにuseStateをインポートします)。私は今、私の元の欠陥のあるものとの違いに非常に興味がありimport { React, useState } from 'react'ます。
JosFabre

1
@JosFabreはsé ごとに非デフォルトとして'react'エクスポートしないため、Reactエラーでした。しかしexport useStateexport Componentなど
c4k

17

TypeScriptでReactJSを使用している人向け。

import * as React from 'react';

3
これが私の問題でした。ありがとう!
Joseph Fehrman、

2
なぜこれが必要なのですか?jestを実行すると、コードベース全体でこのエラーが発生します。
ネイトグレン

インポートを「再び美しく」する方法があります。tsconfig.jsonに「esModuleInterop:true」を追加します。そして「reactからのreactのインポート」をお楽しみください!– Shulyk Volodymyr
Shulyk Volodymyr

0

変更: import {React}を 'react' からimport して 'react'から import します。Reactはデフォルトのエクスポートであり、デフォルトのエクスポートに中括弧は必要ないためです。


0

'react'から複数のクラスをインポートする必要がある場合は、React以外のクラスにエイリアスを設定できます。何かのようなもの、

import React, * as react from 'react';

0

このエラーは不注意のために私に起こりました。それは実際に

import React from 'react';

ブラケットは、次のような名前付きエクスポート用です。

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

新しい質問がある場合は、[ 質問する ]ボタンをクリックして質問してください。コンテキストの提供に役立つ場合は、この質問へのリンクを含めます。- レビューから
MartenCatcher
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.