【第2回】React初心者入門!コンポーネント自作&CSS装飾でトップページを書き換えよう

javascript-react-2 プログラミング

前回はViteを使ってReactの初期画面を表示させるところまで進めましたね!

第2回となる今回は、あの初期画面を丸ごとリセットして、「自分だけのオリジナル・トップページ」 を作っていきます。

Webアプリ開発で超重要になる「コンポーネント(パーツ)の作り方」「CSSを使った見た目の整え方」を同時にマスターしていきましょう!

1. 今回作るものの完成イメージ

今回は、Webサイトの定番である以下の3つのパーツ(コンポーネント)を作って組み合わせます。

  1. Header(ヘッダー): サイトのタイトルを表示する上の帯
  2. ProfileCard(自己紹介カード): アイコンやテキストを囲むカード型のパーツ
  3. CounterButton(カウンター): クリックすると数字が増える体験型ボタン

完成すると、シンプルでおしゃれなプロフィールページが立ち上がります!

2. まずは画面をリセットしよう!

初期状態の App.jsx と App.css の中身を一度きれいに削除して、まっさらな状態からスタートしましょう。

① src/App.css を空にする

src/App.css を開き、中身のコードを全選択(Ctrl + A)してすべて削除し、空のファイルにして保存します。

② src/App.jsx をシンプルにする

src/App.jsx を開き、中身を以下の最小限のコードに書き換えて保存してください。

import './App.css'
// CSSを読み込みます

function App() {
  return (
    <div className="container"> // 後でこのクラスを作成します
      <h1>マイ・ポートフォリオ</h1>
    </div>
  )
}

export default App

以下のコマンドで開発サーバーを立ち上げます。

npm run dev

ブラウザ(http://localhost:5173/)を見て、「マイ・ポートフォリオ」という文字だけが表示されていればリセット完了です!

3. 代表的なコンポーネントを作ってみよう!

ここからが本番です!パーツごとに新しいファイルを作っていきます。

💡 コンポーネント作りの大原則

  • ファイル名の先頭は大文字にする(例:Header.jsx)
  • 関数名も先頭は大文字にする(例:function Header() { … })
  • 必ず最後に export default コンポーネント名 を書く

パーツ①:ヘッダーコンポーネント(Header.jsx)

まずは画面の一番上に表示するヘッダーを作ります。

src フォルダの中に Header.jsx という新しいファイルを作成し、以下のコードを書いてみましょう。

function Header() {
  return (
    <header className="header">
      <h1 className="header-title">My React App</h1>
      <nav>
        <ul className="nav-list">
          <li>Home</li>
          <li>About</li>
        </ul>
      </nav>
    </header>
  )
}

export default Header

パーツ②:自己紹介カード(ProfileCard.jsx)

次に、プロフィールを表示するカード型のパーツを作ります。 src フォルダの中に ProfileCard.jsx を作成します。

function ProfileCard() {
  return (
    <div className="profile-card">
      <div className="avatar">🚀</div>
      <h2>React 太郎</h2>
      <p>フロントエンド開発を勉強中のエンジニアです!Webアプリ開発の楽しさを発信中。</p>
    </div>
  )
}

export default ProfileCard

パーツ③:いいね!カウンター(CounterButton.jsx)

最後に、Reactの目玉機能である「押すと画面の数字が増えるインタラクティブなボタン」を作ります。

src フォルダの中に CounterButton.jsx を作成します。

import { useState } from 'react'

function CounterButton() {
  // いいねの数を管理する「State(状態)」
  const [likes, setLikes] = useState(0)

  return (
    <button className="like-button" onClick={() => setLikes(likes + 1)}>
      👍 いいね! {likes}
    </button>
  )
}

export default CounterButton

4. 作ったパーツを App.jsx に集結させる!

3つのパーツが揃いました!これを主役である App.jsx で読み込んで、パズルのように組み立てます。

src/App.jsx を以下のように書き換えてみましょう。

import Header from './Header'
import ProfileCard from './ProfileCard'
import CounterButton from './CounterButton'
// コンポーネントの読み込み
import './App.css'
// CSSの読み込み

function App() {
  return (
    <div className="app-container">
      {/* 1. ヘッダーを配置 */}
      <Header />

      {/* メインコンテンツエリア */}
      <main className="main-content">
        {/* 2. プロフィールカードを配置 */}
        <ProfileCard />
        
        {/* 3. いいねボタンを配置 */}
        <CounterButton />
      </main>
    </div>
  )
}

export default App

💡 JSXのポイント 自作したコンポーネントは、HTMLタグと同じように <Header/> や <ProfileCard/> と書くだけで画面に呼び出すことができます!

5. CSSで見た目をオシャレに整えよう!

パーツは配置できましたが、今はまだ素っ気ない見た目です。最後に App.css にCSSを書いて、綺麗にデザインしていきましょう!

CSSを全て理解するのは大変なので、なんとなくでいいと思います。

rc/App.css に以下のスタイルをコピー&ペーストして保存します。

/* 全体のレイアウト */
.app-container {
  max-width: 600px;
  margin: 0 auto;
  font-family: sans-serif;
  color: #333;
}

/* 1. ヘッダーのデザイン */
.header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 1rem 0;
  border-bottom: 2px solid #eee;
}

.header-title {
  margin: 0;
  font-size: 1.2rem;
  color: #61dafbaa;
}

.nav-list {
  display: flex;
  gap: 1rem;
  list-style: none;
  margin: 0;
  padding: 0;
}

/* メインエリア */
.main-content {
  display: flex;
  flex-direction: column;
  align-items: center;
  padding: 2rem 0;
  gap: 1.5rem;
}

/* 2. プロフィールカードのデザイン */
.profile-card {
  background: #f9f9f9;
  border-radius: 12px;
  padding: 2rem;
  text-align: center;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
  width: 100%;
  box-sizing: border-box;
}

.avatar {
  font-size: 3rem;
  margin-bottom: 0.5rem;
}

/* 3. カウンターボタンのデザイン */
.like-button {
  background-color: #61dafb;
  border: none;
  color: #000;
  padding: 0.8rem 1.5rem;
  font-size: 1rem;
  font-weight: bold;
  border-radius: 20px;
  cursor: pointer;
  transition: transform 0.1s, background-color 0.2s;
}

.like-button:hover {
  background-color: #4fa8c7;
  transform: scale(1.05);
}

🎨 ReactでのCSS適用のポイント

  1. class ではなく className を使う:HTMLでは class=”header” と書きますが、React(JSX)では className=”header” と書きます。(※JavaScriptの予約語 class と衝突を避けるためです)
  2. CSSの読み込み方:App.jsx の上で import ‘./App.css’ と宣言しているため、App.css に書いたクラス名がそれぞれのコンポーネントに自動適用されます。

6. まとめ&次回予告

ブラウザを確認してみてください! ヘッダー、プロフィールカード、そしてクリックすると数字が増える「いいねボタン」が綺麗に並んだ以下のようなトップページが完成しました。

  • コンポーネント化: 画面をパーツ(ファイル)ごとに分けると、コードが見やすく管理しやすくなる
  • 再利用性: 作ったパーツは <ProfileCard/> のように何回でも呼び出せる
  • CSSの適用: JSXでは className を使って装飾を当てる

次回は、これらのコンポーネントに「外部からデータを渡す仕組み(Props)」を解説します。

プロフィールカードの名前や文言を自由に変えられるようにレベルアップしていきましょう!

コメント