javascript - 什么时候应该使用花括号进行 ES6 导入?

标签 javascript import ecmascript-6

这似乎很明显,但我发现自己对何时使用花括号在 ES6 中导入单个模块感到有些困惑。例如,在我正在处理的 React-Native 项目中,我有以下文件及其内容:

文件initialState.js

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 括在花括号中,我会收到以下代码行的以下错误:

Cannot read property todo of undefined

文件TodoReducer.js:

export default function todos(state = initialState.todo, action) {
    // ...
}

我的带有花括号的组件也会发生类似的错误。我想知道何时应该对单个导入使用大括号,因为显然,在导入多个组件/模块时,您必须将它们括在大括号中,我知道。

堆栈溢出帖子位于 here没有回答我的问题,而是我问何时我应该或不应该使用花括号来导入 single 模块,或者我不应该使用花括号来导入单个ES6 中的模块(显然不是这种情况,因为我已经看到需要花括号的单个导入)。

最佳答案

这是一个默认导入:

// 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,命名导出分别称为 myASomething

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

默认导出往往用于您通常希望从模块中获得的任何内容。命名的导出往往用于可能很方便但并不总是必需的实用程序。但是,您可以选择如何导出内容:例如,一个模块可能根本没有默认导出。

This is a great guide to ES modules, explaining the difference between default and named exports.

关于javascript - 什么时候应该使用花括号进行 ES6 导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36795819/

相关文章:

javascript - 使用 handlebars 将 json 对象存储到 html 元素

javascript - Jquery 从 POST 函数返回 [Object object]

java - 获取结帐按钮以导航到结帐页面

eclipse - 导入 Guava 源时无法解析导入 javax.inject

node.js - 巴别塔 ES6 : Import node modules that need to be transpiled in ES6 as well

javascript - 将小数四舍五入到前两位有效数字

JavaScript 将对象数组的数组转换为对象数组

react-native - react 原生渲染 foreach 循环

javascript - 鼠标悬停时选取框文本开始移动

javascript - 在 Angular View 中,ng-repeat 的垂直滚动不可见