SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

基礎からはじめるReact入門

Reactによるフォーム/リストの基本

基礎からはじめるReact入門 第4回

Listコンポーネントを作る

 Listコンポーネントは掲示板アプリの投稿を表示する部分です。コードは次の通りです。

リスト2 List.js
import React, { Component } from 'react';
import { Ages } from './Form';

/** 投稿のリスト */
class List extends Component {
  /** 投稿ひとつ分を描画する */
  renderPost(post) {
    return (
      <div>
        <div>名前: {post.name}</div>
        <div>年齢: {this.convertAge(post.age)}</div>
        <div>本文: {post.body}</div>
      </div>
    );
  }
  /** ageを日本語表記に変換する */
  convertAge(age) {
    switch(age) {
      case Ages.TEEN:
        return "10代";
      case Ages.TWENTIES:
        return "20代";
      case Ages.THIRTIES:
        return "30代";
      case Ages.FOURTIES:
        return "40代";
      case Ages.FIFTIES:
        return "50代";
      default:
        throw Error(`不明なageです: ${age}`);
    }
  }
  render() {
    const { posts } = this.props;
    return (
      <div>
        { posts.map((post, index) => { // (1)
          return (
            <div key={`${post.id}`}> {/* (2) */}
              {this.renderPost(post)}
            </div>
          );
        }) }
      </div>
    )
  }
}

export default List;

 Listコンポーネントは、Formで投稿した内容をリストとして表示する、ただのdiv要素の集まりです。

 また、propsは次の構造をしています。

Listコンポーネントのprops
名前
posts Array<{ id, name, age, body }>

 Listコンポーネントの実装で特徴的なのは、postsをmapしてJSXに変換することで、リストを生み出しているところです(1)。第1回で紹介した通り、JSXは最終的にReact.createElementという関数呼び出しに変換され、JavaScriptの式として実行されます。そのため、map関数などを適用することができるのです。

図5 データ変換のイメージ
図5 データ変換のイメージ

 render関数がreturnするJSXも、最終的にはJavaScriptの式に変換されます。これを意識しながらJSXを記述すると、柔軟な書き方ができるようになります。いろいろと試してみてください。

リストの要、key

 Reactでリストを扱う際に忘れてはいけないのが、keyの付与です(2)。ReactはVirual DOMの差分を見ることしかできないので、そのままでは追加・削除を判断することができません。

図6 差分の認識がうまく行かなかった例
図6 差分の認識がうまく行かなかった例

 こういった課題を解決すべく、本当の差分を見分けやすくするために生まれた仕組みがkeyです。たとえ順番が変わっても、keyが同じである限りはReactは同じ要素としてみなしてくれます。

図7 差分の認識ができた例
図7 差分の認識ができた例

 keyの命名の条件は、そのリストの中でユニークな値ならば、何でも構いません。

まとめ

 今回は、フォームとリストの基本について解説しました。要点を抑えればシンプルな仕組みになっているので、アプリケーションのさまざまなところで活用してください。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
基礎からはじめるReact入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 中川 幸哉(ナカガワ ユキヤ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/10593 2017/12/28 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー