反应JSX文件给出错误“无法读取未定义的属性'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,这意味着...

Answers:


196

导入React do import React from 'react'如果要导入的东西不是该模块或文件中的默认导出,请添加括号。如果有反应,这是默认的导出。

这可能适用于您的其他导入,具体取决于您如何定义它们。


18
我不确定为什么会这样,但是对我来说是import * as React from "react"
克林特姆(Clintm)'17

8
从技术上讲,这import React from 'react'是无效的,因为React不是默认的导出,但由于将ES6与babel结合使用,因此它可以工作。也许您的babel配置不同,迫使您使用正确的有效语法import * as React from 'react'。有关更多信息:github.com/DefinitelyTyped/DefinitelyTyped/issues/5128
Kafo

我忘了提到的另一件重要的事情是,JSX要求React在工作范围内。但是,除了Component以及其他命名的导出之外,您实际上并不需要React。也许将来您不会导入React。
卡夫

1
我在expo上使用react-native,我的babel预设是babel-preset-expo github.com/expo/babel-preset-expo/blob/master/index.js
Clintm

2
如果使用打字稿,esModuleInterop则tsconfig中的设置也会影响导入样式。tsconfig必须应用于测试文件(检查includefiles)。
Matthias

33
import React, { Component } from 'react'

这对我有用。不过,我不确定为什么它可以解决此问题。因此,如果您是偶然发现此问题的人,并且使用create-react-app作为您的开始样板,那么这种导入React的方法将可以解决问题。(截至18年10月,哈哈)


这是我尝试导入备忘录时遇到的问题,除了反应之外,还使用了useEffect,useState。最初看到错误“无法读取未定义的属性'memo'”,但这
已将

这也为我修复了它(尽管不是导入State的组件)。我现在非常好奇与我原来的错误的区别import { React, useState } from 'react'
JosFabre

1
@JosFabre,这是错误的,因为'react'不会React按sé 导出为非默认值。然而export useStateexport Component
C4K

17

对于那些使用TypeScript使用ReactJS的人。

import * as React from 'react';

3
这是我的问题。谢谢!
约瑟夫·费曼

2
为什么这是必要的?运行笑话时,我在整个代码库中都收到此错误。
Nate Glenn

有一种方法可以使导入“再次美丽”。在您的tsconfig.json中添加“ esModuleInterop:true”。并享受您的“从'反应'导入React”!– Shulyk Volodymyr
Shulyk Volodymyr19年

0

变化: 进口{}做出反应,从“反应” ,以 进口阵营从“反应” 因为REACT为默认的出口,你不需要任何默认出口大括号内。




By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.