// Conceptual-article //

Reactで配列のレンダリング方法を理解する

Published on January 12, 2021
Default avatar
By joshtronic
Developer and author at DigitalOcean.
日本語
Reactで配列のレンダリング方法を理解する

はじめに

この記事では、Reactで配列をレンダリングする方法と、コンポーネント内のさまざまな要素をレンダリングするときに使用するベストプラクティスについて説明します。

JavaScriptなどの最新のWeb言語を使用する利点の1つは、HTMLチャンクの生成をすばやく自動化できることです。

配列やオブジェクトに対してループのようなものを使用すると、アイテムごとにHTMLを一度記述するだけで済みます。さらに良いことに、将来編集をするときは一度適用するだけで済みます。

複数要素をレンダリングする

Reactで複数のJSX要素をレンダリングするには、.map()メソッドを使用して配列をループし、単一の要素を返すことができます。

以下では、reptiles配列をループして、配列内の各項目のli要素を返します。このメソッドは、配列内の項目ごとに単一の要素を表示するときに使用できます。

function ReptileListItems() {
  const reptiles = ["alligator", "snake", "lizard"];

  return reptiles.map((reptile) => <li>{reptile}</li>);
}

出力は次のようになります。

Output
- alligator - snake - lizard

次の例では、配列によってレンダリングされる要素のリストに一意のkeyを追加する理由について調べます。

コンポーネント内の要素コレクションをレンダリングする

この例では、配列をループして、前の例のように一連のリスト項目コンポーネントを作成します。

まず、<ol>コンポーネントを使用して<li>項目を保持するようにコードを更新します。<ol>コンポーネントは、項目の順序付きリストを作成します。

function ReptileList() {
  const reptiles = ["alligator", "snake", "lizard"];

  return (
    <ol>
      {reptiles.map((reptile) => (
        <li>{reptile}</li>
      ))}
    </ol>
  );
}

ただし、コンソールを見ると、配列またはイテレータ内の各子に一意のキーが必要であるという警告が表示されます。

コンソールの警告表示

コンポーネント内でコレクションをレンダリングしようとすると、keyを追加する必要があるため、警告が表示されます。

Reactでは、一意のkeyを使用して、コレクション内のどのコンポーネントを再レンダリングする必要があるかを判断します。一意のkeyを追加すると、更新が行われるたびにコンポーネント全体を再レンダリングする必要がなくなります。

このステップでは、コンポーネント内の複数の要素をレンダリングし、一意のkeyを追加します。警告を解決するために、コードを更新してリスト項目にkeyを追加します。

function ReptileList() {
  const reptiles = ['alligator', 'snake', 'lizard'];

  return (
    <ol>
      {reptiles.map(reptile => (
        <li key={reptile}>{reptile}</li>
      ))}
    </ol>
  );
}

keyを追加したので、警告はコンソールに表示されなくなります。

次の例では、一般的な構文エラーが発生することなく、隣接する要素をレンダリングする方法を説明します。

隣接する要素のレンダリング

JSXでは、コンポーネント内の複数の要素をレンダリングするには、前後にラッパーを追加する必要があります。

この例では、最初に配列をループせずに項目のリストを返します。

function ReptileListItems() {
  return (
    <li>alligator</li>
    <li>snake</li>
    <li>lizard</li>
  );
}

これにより、コンソールにハードエラーが発生します。

隣接するJSX要素のReactからのハードエラー

このエラーを修正するには、ラッパーでli要素のブロックをラップする必要があります。リストの場合は、olまたはul要素でラップすることができます。

function ReptileListItems() {
  return (
  <ol>
    <li>alligator</li>
    <li>snake</li>
    <li>lizard</li>
  </ol>
  );
}

隣接する<li>要素が、囲みタグ<ol>でラップされ、エラーが表示されなくなります。

次のセクションでは、fragmentコンポーネントを使用したラッパーでリストをレンダリングします。

React.fragmentを使用した隣接する要素のレンダリング

React v16.2より前は、<div>要素でコンポーネントブロックをラップすることができました。これによりアプリケーションがdivsでいっぱいになり、よく「divスープ」と呼ばれていました。

この問題を解決するために、Reactはfragmentコンポーネントと呼ばれる新しいコンポーネントをリリースしました。

囲みタグ内でリストをレンダリングする必要があるが、divの使用を避けたい場合は、代わりにReact.Fragmentを使用できます。

function ReptileListItems() {
  return (
  <React.Fragment>
     <li>alligator</li>
     <li>snake</li>
     <li>lizard</li>
  </React.Fragment>
  );
}

レンダリングされたコードにはli要素のみが含まれ、React.Fragmentコンポーネントはコードに表示されません。

JSX elements rendered inside a React.Fragment wrapper

また、React.fragmentはキーを追加する必要がないことに注意してください。

React.fragmentの記述は、<div>を追加するよりも面倒であることに気づくかもしれません。幸い、Reactチームはこのコンポーネントを表す短い構文を開発しました。<React .Fragment></React.Fragment>の代わりに<> </>を使用できます。

function ReptileListItems() {
  return (
 <>
    <li>alligator</li>
    <li>snake</li>
    <li>lizard</li>
 </>
  );
}

まとめ

この記事では、Reactアプリケーションで配列をレンダリングする方法のさまざまな例を見てきました。

別のコンポーネント内で要素をレンダリングする場合は、一意のkeyを使用して、ラッパー要素内で要素をラップする必要があります。

使用例に応じて、キーを必要としないfragmentコンポーネントでラップされた単純なリストを作成できます。

Reactのベストプラクティスの詳細については、DigitalOceanのHow To Code in React.js(React.jsのコーディング方法)の全シリーズを参照してください。


Want to learn more? Join the DigitalOcean Community!

Join our DigitalOcean community of over a million developers for free! Get help and share knowledge in our Questions & Answers section, find tutorials and tools that will help you grow as a developer and scale your project or business, and subscribe to topics of interest.

Sign up
About the authors
Default avatar
Developer and author at DigitalOcean.

Default avatar
Developer and author at DigitalOcean.

Still looking for an answer?

Was this helpful?
Leave a comment

This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!