Reactで学ぶ 予定管理アプリ開発(第2回)~ コンポーネント分割とprops~

パソコン GitHubでつくって学ぶ

Amazon.co.jp

はじめに

前回は、Vite + Reactの開発環境を構築し、「Hello, PC-LABO!」とカウンターだけの画面を表示するところまで確認した。

今回は、この初期画面を削って、予定管理アプリの本体となる「予定を一覧表示するだけ」のシンプルな画面を作っていく。あわせて、Reactの基本概念であるコンポーネント分割propsを学ぶ。

今回やること

  • 画面の部品(コンポーネント)をファイル単位で分割する
  • 親コンポーネントから子コンポーネントへ、propsを使ってデータを渡す
  • 配列データを.map()でまとめて画面に描画する

状態管理(追加・削除)はまだ扱わない。今回はあくまで「決まったデータを、部品化して表示する」ところまでがゴールである。

コンポーネントを分割する理由

Ver.1では、画面の中身をすべてApp.jsx一つに書いていた。小さな画面ならそれでも困らないが、予定管理アプリのように画面が育っていくことを見越すと、次第に見通しが悪くなる。

そこで、「予定1件分の表示」をScheduleItemという別のコンポーネントに切り出す。Appは「どの予定を表示するか」を管理し、実際の見た目はScheduleItemに任せる、という役割分担にする。

propsとは

propsは、親コンポーネントから子コンポーネントへデータを渡すための仕組みである。関数の引数のようなものだとイメージすると理解しやすい。

// 親から子へ、titleとdateを渡す
<ScheduleItem title="Reactの記事を書く" date="2026-07-21" />

子コンポーネント側は、渡された値を引数として受け取る。

function ScheduleItem({ title, date }) {
  return (
    <li>
      <span>{date}</span>
      <span>{title}</span>
    </li>
  )
}

実装

ファイル構成

02_components-and-props/
└── src/
    ├── App.jsx
    └── components/
        └── ScheduleItem.jsx

package.jsonvite.config.jsなど、環境構築時にツールが自動生成したファイルは今回も変更していない。読むべきは上記2つのファイルだけである。詳しくは第1回を参照)

ScheduleItem.jsx(子コンポーネント)

function ScheduleItem({ title, date }) {
  return (
    <li className="schedule-item">
      <span className="schedule-item__date">{date}</span>
      <span className="schedule-item__title">{title}</span>
    </li>
  )
}

export default ScheduleItem

予定1件分の見た目だけに集中した、シンプルなコンポーネントである。

App.jsx(親コンポーネント)

import './App.css'
import ScheduleItem from './components/ScheduleItem'

const schedules = [
  { id: 1, date: '2026-07-20', title: 'Reactの環境構築を復習する' },
  { id: 2, date: '2026-07-21', title: 'コンポーネント分割の記事を書く' },
  { id: 3, date: '2026-07-22', title: 'propsの動きを検証する' },
]

function App() {
  return (
    <div className="app">
      <h1>予定管理アプリ</h1>
      <p>Ver.2:コンポーネント分割とpropsの練習</p>

      <ul className="schedule-list">
        {schedules.map((schedule) => (
          <ScheduleItem key={schedule.id} title={schedule.title} date={schedule.date} />
        ))}
      </ul>
    </div>
  )
}

export default App

schedulesという配列に予定データを持たせ、.map()で1件ずつScheduleItemに変換している。それぞれのScheduleItemに付けているkeyは、Reactがリストの各要素を正しく識別するために必要なもので、配列の.map()でコンポーネントを並べる際は必ず指定する。

実行結果

npm run devで開発サーバーを起動し、ブラウザで確認する。終了する場合はターミナル上でCtrl + Cを押す(Ctrl + Zは一時停止するだけなので使わない)。

日付とタイトルが並んだ、シンプルな予定一覧が表示される。

今回のまとめ

  • 画面の部品をコンポーネント単位でファイル分割すると、見通しがよくなる
  • propsを使うと、親から子へデータを渡せる
  • .map()を使うと、配列データを一括でコンポーネントに変換できる

次回は、この一覧に「予定の追加・削除」機能を付ける。Reactの状態管理の基本であるuseStateを扱う。

ソースコード

今回のソースコードは、私のGitHubで公開している。以下のリンクを参照していたただきたい。

GitHub:https://github.com/HappyTalk10/pc-labo-react-learning/tree/main/02_components-and-props


コメント

タイトルとURLをコピーしました