React コンポーネントのプロパティには、文字列や数値などの単純なスカラ値だけではなく、配列などの複雑なオブジェクトを渡すことができます。
使用イメージは次のような感じです。
配列型のプロパティを扱うコンポーネントを作成する
次の Books
コンポーネントは、プロパティ titles
で文字列配列を受け取り、それぞれの値を li
要素で描画します。
配列の map
メソッドを使用すると、複数の li
要素を簡単に生成することができます。
この Books
コンポーネントは次のような感じで使用します。
これで、次のような HTML 要素が生成されます。
リスト要素に key を与える
上記のコードを実行すると、React は次のような警告を出力します。
React は 配列要素の再描画処理を効率的に行うため、要素を特定するための key
プロパティ(数値 or 文字列)を要求します。
配列の map
メソッドで複数の要素を生成するとき に、それぞれの要素の key
プロパティとして何らかのユニーク値を設定してやれば、この警告は消えます。
これは li
要素以外の要素(例えば div
要素)であっても同様です。
key
プロパティの値は、同階層のリスト要素間で一意であればよいので、上記のようにリスト要素のインデックスを key
に指定することである程度うまく動作します。
ただし、この方法ではリスト要素の順番が入れ替わった場合などに効率の悪い再描画が発生します。
よりよい方法は、次のように、表示するデータが持っている一意な ID やハッシュ値を指定することです。
このような書き方を可能にするには、元の Books
コンポーネントのプロパティで、データオブジェクト (Book
) の配列を受け取れるように修正する必要があります。
下記に修正後の全体のコードを示します。
(おまけ)コンポーネント内で自主的にデータを取得する
下記の Books
コンポーネントは、DOM 要素として追加された段階 (componentDidMount) で、自分が表示すべきデータを取得して描画を行います。
コンポーネントのライフサイクルメソッドをオーバーライドするため、関数コンポーネントではなく、クラスコンポーネントとして定義する必要があります。
ここでは固定のデータを state
に設定していますが、ネットワークからデータ取得するようなケースでも、このタイミングでデータ取得するとよいでしょう。
Books
コンポーネントは自らデータを取得するため、Books
コンポーネントを使用する側ではデータを渡す必要はありません。
関連記事