React/Next.js基礎
ReactはUIを構築するためのライブラリ、Next.jsはReactを使いやすくしたフレームワークです。このサイトではNext.jsを使ってフロントエンドを開発します。
Reactとは
Reactは、Facebookが開発したUIライブラリです。「コンポーネント」という部品を組み合わせてWebページを作ります。
コンポーネントの概念
Webページを「部品」に分けて管理します:
Header
Sidebar
Card
Button
Footer
JSXの書き方
ReactではJSXという、JavaScript内にHTMLのような記法を書けます。
// コンポーネントの例 function Greeting() { const name = "太郎"; return ( <div> <h1>こんにちは、{name}さん</h1> <p>Reactへようこそ!</p> </div> ); }
JSXのポイント
{}の中にJavaScriptの式を書けるclassの代わりにclassNameを使う- コンポーネント名は大文字で始める(
Greetingなど) - return する要素は1つのタグで囲む
Next.jsとは
Next.jsはReactをベースにした、より高機能なフレームワークです。
Reactだけだと
- ルーティング(ページ遷移)を自分で設定
- 設定ファイルが多い
- SEO対策が難しい
Next.jsなら
- ファイル名がそのままURLになる
- 設定がほぼ不要
- SEO対策も簡単
ファイルベースルーティング
Next.jsでは、ファイルを置くだけでページが作れます。
フォルダ構成 → URL
app/page.tsx → /
app/about/page.tsx → /about
app/products/page.tsx → /products
app/products/[id]/page.tsx → /products/123
useState(状態管理)
useStateは、コンポーネント内で変更可能なデータ(状態)を管理するための機能です。
"use client"; // Next.jsではこれが必要 import { useState } from "react"; function Counter() { // [現在の値, 値を更新する関数] = useState(初期値) const [count, setCount] = useState(0); return ( <div> <p>カウント: {count}</p> <button onClick={() => setCount(count + 1)}> 増やす </button> </div> ); }
useStateのポイント
countは現在の値setCountは値を更新する関数- 直接
count = 1と書いてはダメ。必ずsetCount(1)を使う - 値が変わると、画面が自動的に再描画される
Next.jsでの注意:useStateを使うコンポーネントは、ファイルの先頭に"use client"と書く必要があります。
useEffect(副作用)
useEffectは、コンポーネントが表示されたときや、特定の値が変わったときに処理を実行します。
"use client"; import { useState, useEffect } from "react"; function TodoList() { const [todos, setTodos] = useState([]); // コンポーネントが表示されたときにAPIからデータを取得 useEffect(() => { async function fetchTodos() { const response = await fetch("http://localhost:8000/todos"); const data = await response.json(); setTodos(data); } fetchTodos(); }, []); // [] は「最初の1回だけ実行」の意味 return ( <ul> {todos.map((todo) => ( <li key={todo.id}>{todo.title}</li> ))} </ul> ); }
useEffectの第2引数
[]:最初に1回だけ実行[count]:countが変わるたびに実行- 指定なし:毎回実行(通常は使わない)
props(データの受け渡し)
親コンポーネントから子コンポーネントにデータを渡すには、propsを使います。
// 子コンポーネント:propsでデータを受け取る function TodoItem({ title, completed }) { return ( <li> {completed ? "✅" : "⬜"} {title} </li> ); } // 親コンポーネント:propsでデータを渡す function TodoList() { return ( <ul> <TodoItem title="買い物" completed={true} /> <TodoItem title="掃除" completed={false} /> </ul> ); }
ポイント:propsは親から子への一方通行。子から親にデータを渡すには、関数をpropsで渡します。
コードの読み方のコツ
1. コンポーネントを見つける
大文字で始まる関数(function TodoList)がコンポーネントです。
2. returnの中がUI
returnの中のJSXが、実際に画面に表示される内容です。
3. useStateを探す
useStateがあれば、そのコンポーネントは「状態を持つ」=動的に変わる部分がある。
4. mapでリスト表示
.map()があれば、配列をループして表示しています。
練習問題
Q1. Reactでコンポーネント名を書くときのルールは?
Q2. useStateで値を変更するとき、正しい方法は?
const [count, setCount] = useState(0);
Q3. useEffect(() => {...}, []) の [] は何を意味する?
まとめ
- ✓ Reactはコンポーネント(部品)を組み合わせてUIを作る
- ✓ Next.jsはファイル名がそのままURLになる
-
✓
useStateで状態を管理する -
✓
useEffectで初期処理やデータ取得を行う - ✓ propsで親から子にデータを渡す