为什么es6 react组件仅适用于“导出默认值”?


241

该组件确实起作用:

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

如果我删除了最后一行,则行不通。

Uncaught TypeError: Cannot read property 'toUpperCase' of undefined

我想我不了解es6语法。是不是必须在没有符号“ default”的情况下导出?


7
您可以这样写: export default class Template extends React.Component {
andykenward

我知道。但是,如何导入没有“默认”导出的组件?应该有可能
stkvtflw

2
@stkvtflw如果我回答了您的问题,请接受它,以便其他用户也可以受益。
杰德·理查兹

Answers:


571

无需说明default就可以导出,这是“命名导出”。一个文件中可以有多个命名的导出。所以如果你这样做

class Template {}
class AnotherTemplate {}

export { Template, AnotherTemplate }

那么您必须使用其确切名称导入这些导出。因此,要在另一个文件中使用这些组件,

import {Template, AnotherTemplate} from './components/templates'

或者,如果您以这种default导出方式导出,

export default class Template {}

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

import Template from './components/templates'

每个文件只能有一个默认导出。在React中,惯例是从文件中导出一个组件,并将其导出为默认导出。

导入时,您可以随意重命名默认导出,

import TheTemplate from './components/templates'

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

import Template,{AnotherTemplate} from './components/templates'

12
好。但这似乎是另一个看似武断的决定,我不了解其理由,但必须记住。我是否缺少这样的正当理由?在许多项目中,将有数十个React组件。每个文件都有自己的文件,不管看起来有多小,还是有点肛门的。如果其中许多人共享大量的助手功能,就会特别痛苦。它使更多行的东西保持同步,这似乎有点反作用。我想念什么?

9
谢谢。我认为您的回答完美地解释了这一点:import React, {Component} from 'react';
钱琛

10
好答案。我要添加一些内容:尝试使用如下所示的import语句: import RaisedButton from 'material-ui/RaisedButton'; 而不是 import {RaisedButton} from 'material-ui'; This可以使您的构建过程更快,并且构建输出更小。
Shekhar Kumar


4
@ShekharKumar您是否有import Binding from 'module/Binding'比更高效率的资源import {Binding} from 'module'
Jeevan Takhar

4

添加{}同时导入和导出: 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 };

// App.js
import React from "react";
import DefaultExport, { Export1, Export2 } from "./ExportExample";

export default function App() {
  return (
    <>
      <strong>
        <DefaultExport />
      </strong>
      <br />
      <Export1 />
      <br />
      <Export2 />
    </>
  );
}

⚡️工作的沙盒可以玩:https ://codesandbox.io/s/export-import-example-react-jl839?fontsize =14& hidenavigation =1& theme=dark

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.