这似乎很明显,但我发现自己有点困惑,什么时候在ES6中为导入单个模块使用花括号。例如,在我正在处理的React-Native项目中,我有以下文件及其内容:
var initialState = {
todo: {
todos: [
{id: 1, task: 'Finish Coding', completed: false},
{id: 2, task: 'Do Laundry', completed: false},
{id: 2, task: 'Shopping Groceries', completed: false},
]
}
};
export default initialState;
在todoReducer.js中,我必须在没有花括号的情况下导入它:
import initialState from './todoInitialState';
如果将initialstate
括在花括号中,则会得到以下代码行的以下错误:
无法读取未定义的属性todo
export default function todos(state = initialState.todo, action) {
// ...
}
类似的错误也发生在我的带有花括号的组件上。我在想什么时候应该对单个导入使用花括号,因为很明显,在导入多个组件/模块时,您必须将它们括在花括号中,这一点我是知道的。
这里的stack ;overflow帖子没有回答我的问题,相反,我在问什么时候应该或不应该使用花括号导入单个模块,或者在ES6中永远不应该使用花括号导入单个模块(显然不是这样,因为我看到过需要使用花括号的单个导入)。
Dan Abramov的回答解释了默认出口和命名出口。
用哪一种?
引用David Herman的话:ECMAScript6支持单一/默认导出样式,并为导入默认提供了最贴心的语法。导入命名导出可以甚至应该稍微不那么简洁。
然而,在TypeScript中,由于重构,名为export更受欢迎。例如,如果默认导出一个类并重命名它,则类名将只在该文件中更改,而在其他引用中不会更改,具有命名导出的类名将在所有引用中重命名。对于实用程序,命名导出也是首选。
总之,你喜欢什么就用什么。
附加
Default导出实际上是一个名称为Default的命名导出,因此Default导出可以导入为:
import {default as Sample} from '../Sample.js';
我认为import
ES6关键字还有一个带星号的符号值得一提。
如果尝试控制台日志混合:
import * as Mix from "./A";
console.log(Mix);
您将获得:
ES6导入什么时候该用花括号?
当您只需要来自模块的特定组件时,括号是金色的,这使得像WebPack这样的捆绑器占用的空间更小。
这是默认导入:
// B.js
import A from './A'
它仅在A
具有默认导出时才起作用:
// A.js
export default 42
在这种情况下,导入时为其分配什么名称并不重要:
// B.js
import A from './A'
import MyA from './A'
import Something from './A'
因为它将始终解析为a
的默认导出。
这是名为a
的命名导入:
import { A } from './A'
它仅在a
包含名为a
的命名导出时才起作用:
export const A = 42
在本例中,名称很重要,因为您要通过其导出名称导入一个特定的东西:
// B.js
import { A } from './A'
import { myA } from './A' // Doesn't work!
import { Something } from './A' // Doesn't work!
要使这些操作正常工作,您需要将相应的命名导出添加到a
:
// A.js
export const A = 42
export const myA = 43
export const Something = 44
一个模块只能有一个默认导出,但可以有任意多个指定导出(零、一、两或多)。您可以将它们一起导入:
// B.js
import A, { myA, Something } from './A'
在这里,我们将默认导出导入为A
,命名导出分别称为mya
和something
。
// A.js
export default 42
export const myA = 43
export const Something = 44
我们还可以在导入时为它们分配所有不同的名称:
// B.js
import X, { myA as myX, Something as XSomething } from './A'
默认导出通常用于您通常期望从模块获得的任何内容。命名导出通常用于可能方便但并不总是必需的实用程序。但是,由您选择如何导出内容:例如,一个模块可能根本没有默认的导出。
这是一个很棒的ES模块指南,解释了默认导出和命名导出之间的区别。
问题内容: 这似乎很明显,但是我发现自己对于何时使用花括号在ES6中导入单个模块感到有些困惑。例如,在我正在从事的React- Native项目中,我具有以下文件及其内容: initialState.js 在TodoReducer.js中,我必须不带花括号将其导入: 如果将花括号括起来,则以下代码行将出现以下错误: 无法读取未定义的属性待办事项 TodoReducer.js: 带有花括号的组件也发
问题内容: 我有两个文件,第一个是todoHelper.js 它有 以后我想在另一个文件中使用,我只是做 但是我也看到人们在默认情况下执行导出而不只是导出。有什么区别? 问题答案: 每个文件只能有一个导出默认值,因此当您导出默认值时,例如 您可以像导入 由于babel知道您正在尝试访问默认组件,因此可以使用任何名称在文件中访问它 现在假设你做 您可以在文件中包含多个此类导出,例如 当您导入时,您将
我有两个文件,第一个是todoHelper。js 它有 导入{addTodo} 但我也看到人们在做默认导出,而不仅仅是导出。有什么区别?
问题内容: 我怎么能说: 为什么函数调用中不需要括号,而最后一行呢? 问题答案: 是一个功能 调用该函数并产生该函数返回的任何值。 setTimeout的目的是在一段时间后运行代码。你需要的功能只是传递给它(这样的setTimeout可以自称在适当的时候函数),因为如果你将它传递给setTimeout的前调用的函数(用括号),将执行 现在 而不是1秒后,。
我创建了一个类(正如书中所说)来保存从键盘输入的一个人的姓名和姓氏,然后还有另一个类,它将一个人的国家代码、区号和号码封装为字符串 Person将用作Hashmap中的键 Class封装了和。许多对象组成了一个表示电话簿的HashMap。 实现了
问题内容: 我知道他们两个都禁用了Nagle的算法。 我什么时候应该/不应该使用它们中的每一个? 问题答案: 首先,不是所有人都禁用Nagle的算法。 Nagle的算法用于减少有线中更多的小型网络数据包。该算法是:如果数据小于限制(通常是MSS),请等待直到收到先前发送的数据包的ACK,同时累积用户的数据。然后发送累积的数据。 这将对telnet等应用程序有所帮助。但是,在发送流数据时,等待A