import * as react from 'react' 与 import react from 'react' 有什么区别

IT技术 reactjs
2021-03-24 19:55:35

我是 React 或一般编码背景的新手。而且我不确定这些陈述之间有什么区别

import * as react from 'react'

import react from 'react'

提前致谢!

3个回答

最常用的import有3种类型。

类型 1

import * as A from 'abc';

这将导入在 abc 中标记为导出的所有内容。您可以使用以下代码访问它们。

A.Component 

类型 2

import {A} from 'abc';

这将从 abc 导入 A,包含如下内容:

export const A = () => {};

类型 3

import A from 'abc';

这将从 abc 导入默认导出为 A。导出可以是这样的:

const B = () => {}; // The name "B" is not exported, only the value.

export default B;  // at the end of component
感谢您的澄清!
2021-05-29 19:55:35
对象。对于这个从 'abc' 导入的 A;导入语法导出像这样导出默认A;
2021-05-31 19:55:35
谢谢。我不清楚类型 3。import A后来是不是我通过声明覆盖它const A =....中的export语句component是正在导入A还是最初导入A此外,在类型 2 中,是否A需要是一个函数(()=>{...}或者它也可以是一个对象export const A={}
2021-06-20 19:55:35

模式import * as React from 'react与 React 中类型系统的使用有关,如 Flow 或 Typescript。使用import React from 'react'导致了导入类型定义的问题。现在在 Typescript 中,您可以使用allowSyntheticDefaultImports标志,它可以解决此问题并导入所有类型,即使您使用import React from 'react'.

或者简单地使用已经解决了这个问题的 create_react_appimport React from 'react'甚至让我们使用typescript。
2021-05-29 19:55:35

一般来说,对于 ES2015 (ES6) module

import * as name from 'module';

是命名空间导入,指示所有导出的对象都将放置在名称命名空间中。然后你可以这样做:

name.blabla1
name.blabla2
etc ...

命名空间不可调用。所以你不能这样做:

name();

尽管:

import name from 'module';

是一个默认导入,相当于:

import {default as name} from 'module';

您仅从module导入默认对象。

在 React 的情况下,混淆可能/很可能是由于 React 的默认导出是... React(出于互操作性原因,Babel 添加了默认导出)。严格来说,使用的语法是:

import * as React from 'react';

或者

import {Whatever} from 'react';

以下工作仅因为 Babel 的转换(不是 100% 确定):

import React from 'react';
import React, { Whatever } from 'react';

对于那些使用 TypeScript 的人,在 2.7 版之前,默认处理:

import * as name from 'module';

相当于:

const name = require('module');

和:

import name from 'module';

相当于:

const name = require('module').default;

从 2.7 版开始,如果您的编译器设置将“esModuleInterop”指定为 true(推荐),那么您可以使用 ES2015 语法行为。