3分で整理する Next.js のための React 超入門
· 7 min read
目標:Next.js の
page.tsxを「だいたい読める・ちょっと書ける」レベル までの React を一気に整理。
1. React コンポーネントと JSX の基本
React の「ページ」はただの 関数 です。
// App.tsx(React 単体の例)
const App = () => {
return <h1>Hello React</h1>;
};
export default App;
- 関数コンポーネント:
const App = () => { ... } - JSX:
<h1>...</h1>の部分(HTML っぽい見た目の JS 構文)
Next.js のページも中身はほぼ同じです。
// app/page.tsx(Next.js のトップページ)
export default function Page() {
return <h1>Hello Next.js</h1>;
}
「関数コンポーネントを export default しておくと、それがページになる」という理解でOKです。
2. props でデータを渡す(親→子)
親コンポーネントから子コンポーネントへ値を渡すのが props です。
// Greeting.tsx
type GreetingProps = {
name: string;
};
export const Greeting = ({ name }: GreetingProps) => {
return <p>こんにちは、{name} さん!</p>;
};
使う側:
// App.tsx
import { Greeting } from "./Greeting";
const App = () => {
return (
<div>
<Greeting name="rinta" />
<Greeting name="山田" />
</div>
);
};
export default App;
ポイント:
<Greeting name="rinta" />→nameという props を文字列で渡している({ name }: GreetingProps)→props.nameを分割代入で受け取っている
Next.js のコンポーネントでも props の受け渡しパターンは同じ です。
Props 型の書き方メモ(TypeScript)
typeでもinterfaceでも OK。小さなコンポーネントならtypeがシンプル。- props は「受け取る形」に合わせて型を付ける(例:
{ name, age }: UserProps)。 - Next.js でも型定義の置き場所は自由だが、1ファイル1コンポーネントなら同じファイルに書いてよい。
3. useState と onClick で動く UI(カウンター)
React が「ただのテンプレート」と違うのは、状態(state) を持てること。
import { useState } from "react";
export const Counter = () => {
const [count, setCount] = useState<number>(0);
const handleClick = () => {
setCount(count + 1);
};
return (
<button onClick={handleClick}>
カウント: {count}
</button>
);
};
useState(0)→count(現在の値)とsetCount(更新する関数)をくれるonClick={handleClick}→ ボタンがクリックされたらhandleClickを実行setCount(count + 1)→ state を更新 → コンポーネントが再レンダリング → 表示も更新
Next.js のクライアントコンポーネントだと、こんな形になります。
// app/page.tsx
"use client";
import { useState } from "react";
export default function Page() {
const [count, setCount] = useState(0);
return (
<main>
<button onClick={() => setCount(count + 1)}>
カウント: {count}
</button>
</main>
);
}
"use client"; が付くだけで、中身はほぼ同じです。
4. フォーム入力:value + onChange
React では、入力フォームも state で管理する のが基本です。
import { useState } from "react";
export const NameForm = () => {
const [name, setName] = useState<string>("");
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
setName(e.target.value);
};
return (
<div>
<input
value={name}
onChange={handleChange}
placeholder="名前を入力"
/>
<p>こんにちは、{name || "ゲスト"} さん</p>
</div>
);
};
value={name}→ input の中身はnamestate で決まるonChange={handleChange}→ 入力が変わるたびに呼ばれるsetName(e.target.value)→ 入力値で state を更新
「UIは常に state の結果」 というのが React の基本的な考え方です。
5. 配列 state と .map() + key(TODOリスト)
一覧表示は 配列 + .map() のパターンになります。
import { useState } from "react";
export const TodoList = () => {
const [items, setItems] = useState<string[]>(["買い物", "勉強"]);
const handleAdd = () => {
setItems([...items, `タスク${items.length + 1}`]);
};
return (
<div>
<button onClick={handleAdd}>追加</button>
<ul>
{items.map((text) => (
<li key={text}>{text}</li>
))}
</ul>
</div>
);
};
useState<string[]>(...)→ 「文字列の配列」を state に持つitems.map((text) => <li key={text}>{text}</li>)→ 配列から<li>を並べて表示key={text}→ React にとっての「その要素のID」。リストでは必須。
Next.js のページ内でも、このパターンがそのまま使えます。
6. useEffect で「初回だけ処理する」(fetch など)
API からデータを取るなどの「副作用」は useEffect に書きます。
import { useEffect, useState } from "react";
type Post = {
id: number;
title: string;
};
export const PostList = () => {
const [posts, setPosts] = useState<Post[]>([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
const fetchPosts = async () => {
const res = await fetch("https://jsonplaceholder.typicode.com/posts?_limit=5");
const data: Post[] = await res.json();
setPosts(data);
setLoading(false);
};
fetchPosts();
}, []); // ← 依存配列が [] だと「マウント時に一回だけ」
if (loading) return <p>読み込み中...</p>;
return (
<ul>
{posts.map((post) => (
<li key={post.id}>{post.title}</li>
))}
</ul>
);
};
useEffect(() => { ... }, [])→ コンポーネントが 初回表示されたときに一回だけ 実行fetch(...)→ ブラウザの fetch API(JSの機能)setPosts(data)→ 結果を state に保存 → 再レンダリングで一覧表示
Next.js のクライアントコンポーネントでも、使い方は同じです。
7. Next.js での位置づけ
このページで扱った React の要素は、そのまま Next.js の中でこう対応します:
export default function Page()→ React 関数コンポーネント"use client";→useState/useEffectを使うコンポーネントの宣言- props を受け取るコンポーネント → レイアウトや UI 部品として
page.tsxから呼び出される useState,useEffect,.map()→ クライアント側で動くインタラクティブな UI の基本パターン
まとめ
Next.js のコードを読むために、React でまず押さえておきたいのはこの6つです。
- 関数コンポーネント + JSX
- props でデータを渡す
useState+onClickで動くUI- フォーム入力(
value+onChange) - 配列 state +
.map()+key useEffectで「初回だけ fetch する」
ここまで理解できれば、公式ドキュメントやブログ記事の Next.js サンプルコードは 「調べながらなら十分追いかけられる」レベル になっているはずです。