es6反応コンポーネントが「デフォルトのエクスポート」でのみ機能するのはなぜですか?


241

このコンポーネントは機能します:

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

最後の行を削除すると機能しません。

Uncaught TypeError: Cannot read property 'toUpperCase' of undefined

おそらく、私はes6構文の何かを理解していません。「デフォルト」の記号なしでエクスポートする必要はありませんか?


7
あなたは次のように書くことができます export default class Template extends React.Component {
andykenward

知っている。しかし、「デフォルト」なしでエクスポートされたコンポーネントをどのようにインポートできますか?可能である必要があります
stkvtflw

2
@stkvtflw私があなたの質問に答えたら、他のユーザーも利益を得られるようにそれを受け入れてください。
Jed Richards、

回答:


571

なしでエクスポートすることdefaultは、「名前付きエクスポート」です。1つのファイルに複数の名前付きエクスポートを含めることができます。これを行うと、

class Template {}
class AnotherTemplate {}

export { Template, AnotherTemplate }

次に、正確な名前を使用してこれらのエクスポートをインポートする必要があります。これらのコンポーネントを別のファイルで使用するには、

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

または、defaultこのようなエクスポートとしてエクスポートすると、

export default class Template {}

次に、別のファイルで{}、次のようにを使用せずにデフォルトのエクスポートをインポートします。

import Template from './components/templates'

ファイルごとにデフォルトのエクスポートは1つだけです。Reactでは、ファイルから1つのコンポーネントをエクスポートし、それをデフォルトのエクスポートとしてエクスポートするのが慣例です。

インポートするときに、デフォルトのエクスポートの名前を自由に変更できます。

import TheTemplate from './components/templates'

また、デフォルトのエクスポートと名前付きエクスポートを同時にインポートできます。

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

12
OK。しかし、これは、もう1つの一見恣意的な決定のように思われますが、その根拠はわかりませんが、覚えておく必要があります。私はそれがこのようないくつかの正当な理由を見逃していますか?多くのプロジェクトでは、数十のReactコンポーネントが存在します。どれだけ小さくても、それぞれ独自のファイルを持っているので、まあ、少しアナルです。それらの多くがヘルパー関数の集まりを共有している場合、特に痛いです。これは、より多くの行の同期を維持するために役立ちますが、これは少し反対の良さのようです。何が欠けていますか?

9
ありがとうございました。私はあなたが答えてこれを完全に説明したと思います:import React, {Component} from 'react';
Qian Chen

10
いい答えだ。私はそれに追加するものがあります:次のようなimportsステートメントを使用してみてください: これのimport RaisedButton from 'material-ui/RaisedButton'; 代わりに import {RaisedButton} from 'material-ui';、ビルドプロセスが速くなり、ビルド出力が小さくなります。
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 />
    </>
  );
}

sand️サンドボックスを使って遊ぶ:https ://codesandbox.io/s/export-import-example-react-jl839?fontsize=14&hidenavigation=1&theme=dark

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.