コンポーネントのインポートとエクスポート

コンポーネントの魅力は再利用のしやすさにあります。他のコンポーネントを組み合わせて新しいコンポーネントを作ることができるのです。しかし、コンポーネントのネストが増えてくると、それらを別のファイルに分割したくなってきます。これにより、欲しいファイルを簡単に見つけ出し、より多くの場所でコンポーネントを再利用できるようになります。

このページで学ぶこと

  • ルートコンポーネントファイルとは何か
  • コンポーネントのインポート・エクスポートの方法
  • デフォルトインポート/エクスポートと名前付きインポート/エクスポートの使い分け
  • 1 つのファイルから複数のコンポーネントをインポート・エクスポートする方法
  • コンポーネントを複数のファイルに分割する方法

ルートコンポーネントファイル

初めてのコンポーネントでは、Profile コンポーネントと、それをレンダーする Gallery コンポーネントを作成しました。

function Profile() {
  return (
    <img
      src="https://react.dev/images/docs/scientists/MK3eW3As.jpg"
      alt="Katherine Johnson"
    />
  );
}

export default function Gallery() {
  return (
    <section>
      <h1>Amazing scientists</h1>
      <Profile />
      <Profile />
      <Profile />
    </section>
  );
}

これらのコンポーネントは今のところ、ルート (root) コンポーネントファイル(この例では App.js という名前)に置かれています。セットアップによっては、ルートコンポーネントは別のファイルに存在するかもしれません。Next.js のようなファイルベースのルーティングがあるフレームワークを使っている場合、ルートコンポーネントはページごとに異なるものになります。

コンポーネントのエクスポートとインポート

もし将来ランディングページを変更して科学書のリストを表示したくなった場合はどうでしょうか。あるいはプロフィールを別の場所に表示したくなった場合は? GalleryProfile はルートコンポーネントファイル以外の場所に置きたくなるでしょう。これによりコンポーネントはよりモジュール化され、他のファイルから再利用可能になります。コンポーネントの移動は以下の 3 ステップで行えます。

  1. コンポーネントを置くための新しい JS ファイルを作成する
  2. デフォルトエクスポートあるいは名前付きエクスポートのいずれかを使い、関数コンポーネントをそのファイルからエクスポートする
  3. そのコンポーネントを、利用する側のファイルでインポートする。デフォルトエクスポートされたのか名前付きエクスポートされたのかに応じて、対応するインポート手法を使う。

以下の例では、ProfileGallery の両方が、App.js から Gallery.js という新しいファイルに移動しています。App.js を書きかえて、Gallery.js から Gallery をインポートするようにできます。

import Gallery from './Gallery.js';

export default function App() {
  return (
    <Gallery />
  );
}

元の例がどのようにして 2 つのコンポーネントファイルに分割されたか確認しましょう。

  1. Gallery.js は:
    • Profile を定義しているが、これは同一ファイル内でしか使われてないのでエクスポートしていない。
    • デフォルトエクスポートとして Gallery コンポーネントをエクスポートしている。
  2. App.js は:
    • Gallery.js から Galleryデフォルトインポートしている。
    • ルートの App コンポーネントをデフォルトエクスポートしている。

補足

.js というファイル拡張子が省略された、以下のようなファイルを見ることがあるかもしれません。

import Gallery from './Gallery';

React では './Gallery.js' でも './Gallery' でも動作しますが、前者の方がネイティブ ES モジュールの動作により近い方法です。