Tệp React JSX đưa ra lỗi "Không thể đọc thuộc tính 'createElement' của undefined"


100

Tôi có một tệp test_stuff.js mà tôi đang chạy với npm test

Nó khá giống như thế này:

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

Thật không may, tôi gặp lỗi

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

Điều đó nghĩa là gì? Tôi đang nhập thành công React từ 'react', vậy tại sao React lại không được xác định? Nó là _react.React, bất kể điều đó có nghĩa là ...

Câu trả lời:


194

Để nhập React do import React from 'react'Bạn thêm dấu ngoặc khi thứ bạn đang nhập không phải là tệp xuất mặc định trong mô-đun hoặc tệp đó. Trong trường hợp phản ứng, đó là xuất mặc định.

Điều này có thể áp dụng cho các lần nhập khác của bạn tùy thuộc vào cách bạn xác định chúng.


17
Tôi không chắc chắn lý do tại sao chỉ được nêu ra nhưng đối với tôi nó làimport * as React from "react"
Clintm

8
Nói về mặt kỹ thuật, import React from 'react'nó không hợp lệ vì React không phải là xuất mặc định nhưng nó hoạt động do sử dụng ES6 kết hợp với babel. Có thể cấu hình babel của bạn khác buộc bạn phải sử dụng đúng cú pháp hợp lệ import * as React from 'react'. Để biết thêm: github.com/DefinitelyTyped/DefinitelyTyped/issues/5128
Kafo

Một điều quan trọng khác mà tôi quên đề cập là JSX yêu cầu React phải có phạm vi hoạt động. Tuy nhiên, bạn không thực sự cần React ngoài Thành phần và có thể xuất khẩu có tên khác. Có thể trong tương lai bạn sẽ không nhập React.
Kafo

1
Tôi đang sử dụng phản ứng bản địa với hội chợ và babel cài sẵn của tôi là babel-preset-expo github.com/expo/babel-preset-expo/blob/master/index.js
Clintm

2
Nếu sử dụng typecript, kiểu nhập cũng sẽ bị ảnh hưởng bởi cài đặt esModuleInteroptrong tsconfig. Tsconfig phải áp dụng cho các tệp thử nghiệm (kiểm tra includefiles).
Matthias

32
import React, { Component } from 'react'

Điều này đã làm việc cho tôi. Tuy nhiên, tôi không chắc tại sao nó lại khắc phục được phiên bản của tôi về vấn đề này. Vì vậy, nếu bạn là người tình cờ gặp phải vấn đề này và bạn sử dụng ứng dụng create-react làm bản soạn thảo ban đầu, thì cách nhập React này sẽ thực hiện được mẹo nhỏ. (kể từ ngày 18 tháng 10, lol)


Đây là vấn đề tôi gặp phải, khi cố gắng nhập bản ghi nhớ, useEffect, useState, ngoài phản ứng. Ban đầu đã thấy lỗi "Không thể đọc thuộc tính 'bản ghi nhớ' của không xác định", nhưng điều này đã sửa nó
SeanMC

Điều này cũng đã khắc phục sự cố cho tôi (mặc dù thay vì Thành phần, tôi nhập useState). Bây giờ tôi rất tò mò về sự khác biệt với bản gốc, bị lỗi của tôi import { React, useState } from 'react';
JosFabre

1
@JosFabre nó bị lỗi vì 'react'không xuất Reactdưới dạng không mặc định theo mỗi sé. Tuy nhiên export useState, nó , export Componentv.v.
c4k

17

Đối với những người đang làm việc ReactJS với TypeScript.

import * as React from 'react';

3
Đây là vấn đề của tôi. Cảm ơn!
Joseph Fehrman

2
Tại sao điều này là cần thiết? Tôi gặp lỗi này trên toàn bộ codebase của mình khi chạy jest.
Nate Glenn

Có một cách để làm cho import "đẹp trở lại". Thêm "esModuleInterop: true" vào tsconfig.json của bạn. Và tận hưởng "nhập React từ 'react'" của bạn! - Shulyk Volodymyr
Shulyk Volodymyr

0

Thay đổi: nhập {React} từ 'react' để nhập React từ 'react' Vì React là một xuất mặc định và bạn không cần dấu ngoặc nhọn cho bất kỳ xuất mặc định nào.


0

Nếu trong trường hợp bạn cần nhập nhiều lớp từ 'react', bạn có thể đặt bí danh cho chúng ngoại trừ React. Cái gì đó như,

import React, * as react from 'react';

0

Lỗi này xảy ra với tôi do bất cẩn. Nó thực sự

import React from 'react';

Dấu ngoặc dành cho các xuất khẩu được đặt tên như sau:

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

Nếu bạn có câu hỏi mới, vui lòng đặt câu hỏi bằng cách nhấp vào nút Đặt câu hỏi . Bao gồm một liên kết đến câu hỏi này nếu nó giúp cung cấp ngữ cảnh. - Từ đánh giá
MartenCatcher
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.