当前位置: 首页 > 知识库问答 >
问题:

使用括号和javascript导入语法

朱经武
2023-03-14

我遇到了一个javascript库,它使用以下语法来导入库:

import React, { Component, PropTypes } from 'react';

上面的方法和下面的方法有什么区别?

import React, Component, PropTypes from 'react';

共有2个答案

燕俊明
2023-03-14
匿名用户

import React, { Component, PropTypes } from 'react'

这将从'react'模块中获取导出的{Component,PropTypes}成员,并将它们分别分配给组件PropTypes<代码>反应将等于模块的默认值导出。

正如下面torazaburo所指出的,这与

import { default as React, Component, PropTypes } from 'react'

这是

import { default as React, Component as Component, PropTypes as PropTypes} from 'react'

下面是另一个示例(链接到gist):

// myModule.js
export let a = true
export let b = 42
export let c = 'hello, world!'
// `d` is not exported alone
let d = 'some property only available from default'

// this uses the new object literal notation in es6
// {myVar} expands to { myVar : myVar }, provided myVar exists
// e.g., let test = 22; let o = {test}; `o` is then equal to { test : 22 }
export default { a, b, d }

// example1.js
import something from 'myModule'
console.log(something)
// this yields (note how `c` is not here):
/*
  {
    a : true,
    b : 42,
    d : 'some property only available from default'
  }
*/

// example2.js
import something, { c } from 'myModule'
console.log(something)  // same as above; the `default` export
console.log(c)          // c === 'hello, world!'

// example3.js
import { a, b, d, default as something } from 'myModule'
console.log(a)            // a === true
console.log(b)            // b === 42
console.log(d)            // d === undefined (we didn't export it individually)
console.log(something.d)  // something.d === 'some property...'

我用Babel测试了第二个例子:

import test, test3, test2 from './app/lib/queries.js'
console.log(test, test3, test2)

并得到一个语法错误。

~/code/repo/tutoring $ babel-node test.js
/Users/royhowie/.node/lib/node_modules/babel/node_modules/babel-core/lib/babel/transformation/file/index.js:601
      throw err;
            ^
SyntaxError: /Users/royhowie/code/repo/tutoring/test.js: Unexpected token (1:13)
> 1 | import test, test3, test2 from './app/lib/queries.js'
    |              ^
  2 | 
  3 | console.log(test, test3, test2)
  4 | 

作为参考,您可以从MDN阅读新的import文档。然而,它显然需要技术审查。Axel Rauschmayer博士的博文是目前更好的参考。

易骁
2023-03-14
import React, { Component, PropTypes } from 'react';

这上面写着:

在名称react下从'react'导入默认导出,并在相同名称下导入命名导出组件PropTypes

这结合了你可能见过的两种常见语法

import React from 'react';
import { Component, PropTypes } from 'react';

第一个用于导入和命名默认导出,第二个用于导入指定的命名导出。

一般来说,大多数模块要么提供单个默认导出,要么提供命名导出的列表。模块同时提供默认导出和命名导出的情况稍不常见。但是,如果存在一个最常用的导入特征,但也存在其他子特征,则将第一个特征导出为默认特征,将其余特征导出为命名导出是有效的设计。在这种情况下,您将使用所引用的import语法。

其他答案介于错误和混乱之间,可能是因为提出这个问题时的MDN文件是错误和混乱的。MDN展示了这个例子

import name from "module-name";

并且说,name是“将接收导入值的对象的名称”。但这是误导和错误的;首先,只有一个导入值将被“接收”(为什么不说“分配给”或“用于引用”)name,在这种情况下,导入值是模块的默认导出。

解释这一点的另一种方式是注意到上面的导入与

import { default as name } from "module-name";

OP的例子与

import { default as React, Component, PropTypes } from 'react';

MDN文档接着展示了这个示例

import MyModule, {foo, bar} from "my-module.js";

并声称这意味着

导入整个模块的内容,其中一些还显式命名。这将在当前范围中插入myMoules(原文如此)、foobar。注意foomyModule.foo是相同的,因为是barmyModule.bar

MDN在这里所说的,以及其他基于不正确的MDN文档的答案所声称的,都是绝对错误的,并且可能是基于规范的早期版本

导入默认模块导出和一些明确命名的导出。这会将MyModulefoobar插入当前范围。导出名称foobar无法通过MyModule访问,这是默认导出,而不是覆盖所有导出的某个伞。

(默认模块导出是使用export default语法导出的值,也可以是export{foo as default}

MDN文档编写者可能会对以下表单感到困惑:

import * as MyModule from 'my-module';

这将从my-模块导入所有导出,并使它们可以在MyModule.name等名称下访问。默认导出也可以作为MyModule.default访问,因为默认导出实际上只不过是另一个名为默认的命名导出。在此语法中,无法仅导入命名导出的子集,尽管可以导入默认导出(如果有的话)以及所有命名导出

import myModuleDefault, * as myModule from 'my-module';

 类似资料:
  • 问题内容: 我遇到了一个使用以下语法导入库的javascript库: 上面的方法和下面的方法有什么区别? 问题答案: 这说: 从名称下导入 默认* 导出,并以相同的名称导入 命名的 导出。 * 这结合了您可能已经看到的两种常见语法 第一个用于导入和命名默认导出,第二个用于导入指定的命名导出。 通常,大多数模块将提供单个默认导出或命名导出列表。模块同时提供默认导出 和 命名导出的情况要少一些。但是,

  • 这似乎很明显,但我发现自己有点困惑,什么时候在ES6中为导入单个模块使用花括号。例如,在我正在处理的React-Native项目中,我有以下文件及其内容: 在todoReducer.js中,我必须在没有花括号的情况下导入它: 如果将括在花括号中,则会得到以下代码行的以下错误: 无法读取未定义的属性todo 类似的错误也发生在我的带有花括号的组件上。我在想什么时候应该对单个导入使用花括号,因为很明显

  • 问题内容: 我有两个文件,第一个是todoHelper.js 它有 以后我想在另一个文件中使用,我只是做 但是我也看到人们在默认情况下执行导出而不只是导出。有什么区别? 问题答案: 每个文件只能有一个导出默认值,因此当您导出默认值时,例如 您可以像导入 由于babel知道您正在尝试访问默认组件,因此可以使用任何名称在文件中访问它 现在假设你做 您可以在文件中包含多个此类导出,例如 当您导入时,您将

  • 我有两个文件,第一个是todoHelper。js 它有 导入{addTodo} 但我也看到人们在做默认导出,而不仅仅是导出。有什么区别?

  • 问题内容: 例如,如果括号/括号在以下情况中匹配: 依此类推,但如果括号/括号不匹配,则应返回false,例如: 等等。你能检查一下这个代码吗?提前致谢。 问题答案: 您的代码在处理’{‘和’}’字符时有些困惑。它应该与如何处理’(’和’)’完全平行。 这段代码经过您的稍微修改后,似乎可以正常使用:

  • 我在看stackoverflow的另一页时,遇到了一个循环排序的工作实现,但我不明白在while循环中,带分号的语句如何在大括号之前存在。我认为while循环应该完全终止,一旦找到带有分号的语句,就不会执行进一步的操作,那么大括号中的代码是如何执行的呢?乍一看,我会将其解释为“var”随着while循环的每次迭代而递增——但我知道情况并非如此,因为将其从该点移除并将“var”放在花括号内会导致无限