【问题标题】:What is use of curly braces in an ES6 import statement?ES6 import 语句中花括号的用途是什么?
【发布时间】:2017-05-11 07:12:04
【问题描述】:

我可以看到有两种不同的导入方式:

import React from 'react'
import { render } from 'react-dom'

第二个有括号。两者有什么区别?什么时候应该加括号?

【问题讨论】:

标签: reactjs redux


【解决方案1】:

首先,非常感谢所有其他答案。

这是对以上所有内容的总结,在一个答案中。

示例背景

import React from 'react';          // Importing without braces
import { render } from 'react-dom'; // Importing with braces

要了解import,首先要了解export及其类型。

出口类型

主要有两种类型的导出,'default'和'named'。是否使用大括号,完全取决于导入的是哪种类型的导出变量。

所以,简短的回答是默认导出的变量,不需要需要大括号,但命名变量需要用大括号导入。

现在,让我们看一些如何导入和导出这两种类型的实际示例。

默认:如何导出和导入

  • 出口
// Module1.js
export default App;

// Module2.js
export default myVariable;

// Module3.js
export default myFunction;

// Please note that there can only be one default export per module!
  • 正在导入
import App from './Module1'
import AppRenamed from './Module1'

import myVariable from, './Module2'
import myFunction from './Module3'

// Please note that default modules can be renamed when importing
// ... and they will still work!

命名:如何导出和导入

  • 出口
export const A = 42
export const myA = 43
export const Something = 44

export { cube, foo, graph };

// Note how there can be several named exports per module
// exported in groups or individually
  • 正在导入
import { A, myA } from './my-module.js';
import { Something as aRenamedVar } from './my-module.js';
import { cube } from './my-module.js';
import { foo, graph } from './my-module.js';

// Likewise, named exports can be imported in groups or individually

其他说明

  • 让我们回顾一下我们在上面看到的第一个示例
import React from 'react'
import { render } from 'react-dom'
  • 请注意,虽然React 不使用大括号,而render 使用大括号,但render 实际上是react-dom 的一部分。
  • 因此也可以导入整个默认react-dom 没有大括号,然后使用render
import React from 'react'
import ReactDOM from 'react-dom'

ReactDOM.render()

【讨论】:

    【解决方案2】:

    大括号用于导入single(specific) property,而没有大括号的单词是importentire object形成该文件。

    例如,

    import React, { Component } from 'react';
    

    这里React这个词代表从文件'react'导入entire object

    {Component} 表示我们指定从文件中导入particular property

    【讨论】:

      【解决方案3】:

      考虑primitives.js

      export default (a, b) => a + b;
      export const sub = (a, b) => a - b;
      export const sqr = a => a**2;
      

      可以这样导入,

      import sum, { sub, sqr } from './primitives';
      

      在这种情况下,sum 称为“默认导出”,一个模块可能只包含一个“默认导出”。

      subsqr 被称为“命名导出”,一个模块可能包含多个命名导出。

      【讨论】:

        【解决方案4】:

        如果您默认导出,则无需添加括号。模块中只能有默认值。

        案例一:

        export default function(num1, num2) {
            return num1 + num2; }
        

        案例 2:

        function sum(num1, num2) {
            return num1 + num2; }
        
        export { sum as default };
        

        案例 3:

        function sum(num1, num2) {
            return num1 + num2; }
        
        export default sum;
        

        你可以导入默认的

        import sum from "./test.js";
        
        console.log(sum(1, 2));
        

        【讨论】:

          【解决方案5】:

          嗯,您是否应该在括号内或不带括号导入组件之间的区别在于您export它的方式。

          有两种类型的导出

          1. 默认导出
          2. 命名导出

          一个组件可以有一个默认导出和零个或多个命名导出。

          如果一个组件是默认导出,那么你需要在不带括号的情况下导入它。

          例如,

          export default App;
          

          导入为

          import App from './path/to/App';
          

          命名的导出可能是这样的

          export const A = 25;
          

          export {MyComponent};
          

          然后你可以将其导入为

          import {A} from './path/to/A';
          

          import {A as SomeName} from './path/to/A';
          

          如果您的组件有一个默认导出和几个命名导出,您甚至可以在导入时将它们混合在一起

          import App, {A as SomeName} from './path/to/file';
          

          类似地,reactreact-domReactReactDOM 分别是 default exports,而例如 Componentnamed exportreactrender 是一个命名在react-dom 中导出。这就是你可以这样做的原因

          import ReactDOM from 'react-dom';
          

          然后使用

          ReactDOM.render()
          

          或者像你的问题中提到的那样使用它。

          【讨论】:

          • 这个答案似乎非常明确... 一个 默认导出 plus 多个命名导出(每个脚本文件允许)... 然后导入默认导出:没有大括号,导入命名导出:必须使用大括号。是官方参考developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 之一吗? (ES6 标准的一部分)
          • 但是为什么要区分默认和命名:)?
          猜你喜欢
          • 1970-01-01
          • 2017-07-17
          • 1970-01-01
          • 2018-03-24
          • 1970-01-01
          • 2014-09-09
          • 1970-01-01
          • 2012-03-22
          相关资源
          最近更新 更多