为什么es6反应组件仅适用于"导出默认值"?

stk*_*flw 221 javascript ecmascript-6

该组件确实有效:

export class Template extends React.Component {
    render() {
        return (
            <div> component </div>
        );
    }
};
export default Template;
Run Code Online (Sandbox Code Playgroud)

如果我删除最后一行,它不起作用.

Uncaught TypeError: Cannot read property 'toUpperCase' of undefined
Run Code Online (Sandbox Code Playgroud)

我想,我不明白es6语法中的一些东西.是不是必须导出没有"默认"的标志?

Jed*_*rds 545

无需出口default就是"命名出口".您可以在单个文件中具有多个命名导出.所以,如果你这样做,

class Template {}
class AnotherTemplate {}

export { Template, AnotherTemplate }
Run Code Online (Sandbox Code Playgroud)

那么你必须使用他们的确切名称导入这些导出.因此,要在另一个文件中使用这些组件,您必须这样做,

import {Template, AnotherTemplate} from './components/templates'
Run Code Online (Sandbox Code Playgroud)

或者,如果您default像这样导出为导出,

export default class Template {}
Run Code Online (Sandbox Code Playgroud)

然后在另一个文件中导入默认导出而不使用{},像这样,

import Template from './components/templates'
Run Code Online (Sandbox Code Playgroud)

每个文件只能有一个默认导出.在React中,从文件中导出一个组件是一种约定,并将其导出为默认导出.

您可以在导入时自由重命名默认导出,

import TheTemplate from './components/templates'
Run Code Online (Sandbox Code Playgroud)

您可以同时导入默认导出和命名导出,

import Template,{AnotherTemplate} from './components/templates'
Run Code Online (Sandbox Code Playgroud)

  • 好.但这似乎是另一个看似随意的决定,我没有看到理由但必须记住.我错过了一些很好的理由吗?在许多项目中,将有数十个React组件.拥有每个自己的文件,无论多么小,好吧,有点肛门.如果他们中的许多人分享帮助函数的团队,那将特别痛苦.它使更多的东西保持同步,这似乎有点反作用.我错过了什么? (10认同)
  • 好答案.我有一些东西可以添加到它:尝试使用这样的import语句:`import RaisedButton来自'material-ui/RaisedButton';`而不是'import {RaisedButton}来自'material-ui';`这将使你的构建过程更快,你的构建输出更小. (10认同)
  • 谢谢.我想你的回答完全解释了这个:`import React,{Component}来自'react';`. (9认同)
  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export (3认同)
  • @ShekharKumar您是否提供了“从模块/绑定”导入绑定比从“模块”导入import {Binding}更有效的资源? (3认同)
  • 像这样的所有风格决定和惯例都有些武断,而且取决于个人偏好.你是对的,有时将许多组件组合成一个带助手的文件可能是有意义的,特别是对于小/简单的项目.我想每个文件中有一个组件的一个原因是测试......当导入该文件进行测试时,如果你只是导入最少量的其他代码和子依赖项,它会有所帮助.另一个原因可能是代码审查期间小型聚焦文件上的简单差异等. (2认同)

Has*_*alp 9

在导入和导出时添加 { }: export { ... };| import { ... } from './Template';

出口import { ... } from './Template'

导出默认import ... from './Template'


这是一个工作示例:

// ExportExample.js
import React from "react";

function DefaultExport() {
  return "This is the default export";
}

function Export1() {
  return "Export without default 1";
}

function Export2() {
  return "Export without default 2";
}

export default DefaultExport;
export { Export1, Export2 };
Run Code Online (Sandbox Code Playgroud)
// App.js
import React from "react";
import DefaultExport, { Export1, Export2 } from "./ExportExample";

export default function App() {
  return (
    <>
      <strong>
        <DefaultExport />
      </strong>
      <br />
      <Export1 />
      <br />
      <Export2 />
    </>
  );
}
Run Code Online (Sandbox Code Playgroud)

??工作沙箱:https : //codesandbox.io/s/export-import-example-react-jl839 ?fontsize =14&hidenavigation=1&theme=dark