HOWTO · React

React で動的コンポーネントを選択する

許可リストのマッピングとフォールバックを使って、カテゴリから定義済みの React コンポーネントを選択してレンダリングします。

このページの内容

React で複数のコンポーネントのうち 1 つをレンダリングするには、許可された各カテゴリをコンポーネント関数に対応付け、選択された関数を検索し、大文字で始まる JSX 変数を通してレンダリングします。"text" のようなカテゴリ文字列でコンポーネントを選ぶことはできますが、コンポーネント名を文字列として組み立てても、その文字列が JavaScript 変数への参照になるわけではありません。

動的コンポーネント名と JSX

JSX は UI を記述するための構文であり、コンポーネントを検索するための独立した仕組みではありません。JSX では、<section> のような小文字の名前は組み込みの HTML 要素を表し、<SomeComponent /> のような大文字で始まる識別子はスコープ内の JavaScript 変数を指します。その変数には、コンポーネント関数またはその他の対応するコンポーネント型が格納されていなければなりません。

JSX はプロジェクトのコンパイラ設定に従って変換されます。React.createElement を使う構成もあれば、別のランタイムを使う構成もあり、生成される正確な呼び出しは設定に依存します。React.createElement は、対応する要素型と props が与えられたときに React 要素を作成できる関数です。

React の動的コンポーネント名

ブログがテキスト、ビデオ、または画像のコンテンツを表示できるとします。まずそれらのコンポーネントを定義し、次にそれらの参照の中から選択します。名前を連結しても、文字列が生成されるだけです。

const SomeComponent = category + "Component";

たとえば、category が "Text" の場合、SomeComponent は "TextComponent" になります。JSX はその文字列を使って、同じ名前の変数を JavaScript スコープ内で検索することはしません。文字列は、文字列の要素型をサポートする API では組み込みの HTML タグを表すことができますが、カスタムコンポーネントの変数を解決することはしません。文字列の大文字・小文字を変更しても、その型は変わらず、コンポーネントへの参照になることもありません。

React で動的コンポーネント名を使用する正しい方法

許可されたカテゴリ値から、すでに定義済みのコンポーネントへの明示的なマッピングを作成します。選択された参照を検索し、そのカテゴリがサポートされていることを確認して、大文字で始まる JSX 識別子を使ってその参照をレンダリングします。

この完全な JavaScript の例では、コンポーネントの選択肢を 1 つの許可リストオブジェクトにまとめています。各関数はラベルを返すため、選択の流れを React のビルド設定なしで Node.js で実行できます。

function TextComponent() {
  return "Text content";
}

function VideoComponent() {
  return "Video content";
}

function PictureComponent() {
  return "Picture content";
}

const componentByCategory = {
  text: TextComponent,
  video: VideoComponent,
  picture: PictureComponent
};

const category = "text";

if (Object.hasOwn(componentByCategory, category)) {
  const SelectedComponent = componentByCategory[category];
  console.log(SelectedComponent());
} else {
  console.log("Unsupported category");
}
Text content

React コンポーネントでは、マッピングを読み取る前に同じ自前のキーの確認を行い、次に JSX を使って選択された参照をレンダリングします。たとえば return <SelectedComponent />; のようにします。カテゴリがサポートされるのは、それが componentByCategory の自前のキーである場合のみです。toString のような継承された名前もフォールバックに回ります。存在しない参照をレンダリングしようとするのではなく、フォールバックコンポーネントやメッセージなど、インターフェースに何を表示すべきかを選択してください。このマッピングは許可リストとして維持してください。ユーザー入力は定義されたエントリのいずれかを選択できますが、任意のコンポーネント名やインポートパスになってはなりません。

提供されている CodeSandbox の例 を使うと、元のテキスト、ビデオ、画像コンポーネントの構成を試すことができます。アプリケーションでは、例のカテゴリをユーザーが選択した値に置き換え、明示的なマッピングとフォールバックの動作を維持してください。