Next.jsのコンポーネントとは?基礎から応用まで徹底解説【初心者向け】

ReactベースのフレームワークであるNext.jsにおいて、コンポーネントはアプリの基本単位です。この記事では、「Next.jsにおけるコンポーネントとは何か」から「状態管理」「再利用のコツ」「サーバーコンポーネントとクライアントコンポーネントの違い」まで、わかりやすく解説していきます。


✅ コンポーネントとは?

Next.jsはReactベースなので、コンポーネントベースでUIを構築します。
コンポーネントとは、ボタン、フォーム、カード、ヘッダー、フッターなどの部品を一つひとつ定義して再利用できる仕組みです。

// 例: ボタンコンポーネント(Button.tsx)
export default function Button({ label }: { label: string }) {
return <button>{label}</button>;
}

このように小さなパーツを組み合わせて、大きなページを組み立てていくのがNext.jsの基本的な考え方です。


🧱 コンポーネントの分類

Next.js(13以降のApp Router構成)では、以下の2種類に分類されます。

種類特徴
サーバーコンポーネントデフォルト。SSR(サーバー側で描画)。DB・APIとの連携に最適
クライアントコンポーネントuse clientを先頭に書く。ユーザー操作や状態管理、イベント処理に必要

🔸 サーバーコンポーネントの例

// app/page.tsx
import Header from '@/components/Header';

export default function HomePage() {
const session = await getSession(); // サーバーで取得

return (
<>
<Header />
<h1>こんにちは、{session?.user?.name ?? 'ゲスト'}さん</h1>
</>
);
}

特徴:

  • デフォルトはサーバーコンポーネント
  • APIやDBとやり取りしやすい
  • useEffectuseState は使えない

🔹 クライアントコンポーネントの例

'use client';

import { useState } from 'react';

export default function LikeButton() {
const [liked, setLiked] = useState(false);

return (
<button onClick={() => setLiked(!liked)}>
{liked ? '❤️ いいね済み' : '♡ いいね'}
</button>
);
}

特徴:

  • フロント側で描画される
  • 状態(useState)や副作用(useEffect)を使える
  • イベント処理(onClickなど)に最適

🎨 コンポーネント設計のコツ

1. 小さく分割する

複雑なUIを一つのファイルにまとめるのではなく、単機能に分けて再利用性を高める

// Header.tsx / Footer.tsx / ProfileCard.tsx など

2. Propsを明示する

type Props = {
name: string;
bio?: string;
};

export default function ProfileCard({ name, bio }: Props) {
return (
<div>
<h2>{name}</h2>
{bio && <p>{bio}</p>}
</div>
);
}

型を明示するとエディタ補完が効き、ミスが減ります。


3. コンポーネントの粒度と再利用性を考える

粒度再利用性
小コンポーネントボタン、画像、タグ◎高い
中コンポーネントカード、フォーム、プロフィール表示◯まあまあ
大コンポーネントユーザーページ、投稿画面△再利用少なめ

🔄 コンポーネントの組み合わせ例

export default function UserPage() {
return (
<>
<Header />
<ProfileSection />
<PhotoSlider />
<YouTubeBlock />
<Footer />
</>
);
}

Header, Footer, ProfileSection, YouTubeBlock などを1つずつパーツ化することで、ページの保守性・再利用性が向上します。


⚠️ よくあるエラーや注意点

エラー/現象原因と対策
useState is not defineduse client を忘れている(クライアントコンポーネントにのみ使える)
Cannot read properties of undefinedpropsを明示していない or 初期値が未定義
React component must start with an uppercase letter関数名が小文字(例:function header())になっている
コンポーネントが再レンダリングされないuseStateuseEffect を適切に使っていない可能性あり
スタイルが当たらないクラス名の誤記、TailwindやCSS Moduleの指定ミス

📁 コンポーネントの構成ディレクトリ(例)

/components
├── Header.tsx
├── Footer.tsx
├── Button.tsx
├── UserProfileSection.tsx
└── YouTubeEmbedBlock.tsx

→ 一つの /components/ フォルダに集約しておくと整理しやすくなります。


🌍 まとめ:Next.jsにおけるコンポーネントの本質

  • Next.jsではサーバーコンポーネントがデフォルト
  • ユーザーの操作を扱うときは use client を付けてクライアントコンポーネントにする
  • 小さく、再利用しやすく、保守性を意識して分ける
  • propsと型定義を丁寧に書くことでバグを減らせる

✏️ こんな時に役立つ

  • サイト全体に同じUI(Header、Footerなど)を使い回したいとき
  • ユーザー固有の情報を動的に表示したいとき
  • SNSリンクや写真スライダーなどを部品化したいとき
  • 他人が見ても読みやすく、拡張しやすい設計にしたいとき

Next.jsは自由度が高い分、「コンポーネントの設計力」が完成度に直結します。
はじめのうちは慣れが必要ですが、UIを「パーツ」として組み立てる意識を持てば、どんどん楽しくなるはずです!

おすすめの記事