Web Technologies WebApp

React基礎|React のフックと fetch の基本

React でよく使う useState / useEffect / useLocation / useContext / fetch について、簡単な説明とコード例を紹介する。

1. useState(状態管理)

コンポーネント内で 状態(変数)を管理 するためのフック。
状態が変更されると、コンポーネントが 再レンダリング される。

例: カウンター

import { useState } from "react";

function Counter() {
  const [count, setCount] = useState(0); // 状態を 0 で初期化

  return (
    <div>
      <p>カウント: {count}</p>
      <button onClick={() => setCount(count + 1)}>増やす</button>
    </div>
  );
}

export default Counter;

ポイント

  • useState(初期値) で状態を作成
  • [状態変数, 更新関数] の配列を受け取る
  • setCount(新しい値) で状態を更新(再レンダリング)
小学生でも理解できるように説明してください。

useState(ものを覚えておく)

ページの中で 数字や文字を覚えておくための道具 だよ!
たとえば、ボタンを押すと カウントが増える 仕組みを作れるよ。

例:ボタンを押すと数字が増える!

import { useState } from "react";

function Counter() {
  const [count, setCount] = useState(0); // 0 からスタート

  return (
    <div>
      <p>今の数: {count}</p>
      <button onClick={() => setCount(count + 1)}>増やす</button>
    </div>
  );
}

export default Counter;

ポイント

  • useState(0)最初の数字を 0 にする
  • setCount(count + 1) をすると、数字が1つ増える
  • useState「覚えておくノート」みたいなもの!

2. useEffect(副作用の処理)

データ取得・購読・クリーンアップなど、レンダリングのタイミングで実行する処理 を定義する。

例: タイマー

import { useState, useEffect } from "react";

function Timer() {
  const [time, setTime] = useState(0);

  useEffect(() => {
    const interval = setInterval(() => {
      setTime((prevTime) => prevTime + 1);
    }, 1000);

    return () => clearInterval(interval); // クリーンアップ(解除)
  }, []); // 初回のみ実行

  return <p>経過時間: {time}秒</p>;
}

export default Timer;

ポイント

  • useEffect(関数, 依存配列)
    • [](空配列)→ 初回のみ実行
    • [変数](依存関係)→ 変数が変わるたびに実行
    • なし毎回レンダリング時に実行
  • return () => {...}クリーンアップ処理 を実行
小学生でも理解できるように説明してください。

useEffect(特別なタイミングで動く)

「ページが表示されたときに、何かをしたい!」ときに使うよ!

たとえば、5秒ごとに「こんにちは!」と表示 するプログラムが作れるよ。

例:5秒ごとにカウントが増える

import { useState, useEffect } from "react";

function Timer() {
  const [time, setTime] = useState(0);

  useEffect(() => {
    const interval = setInterval(() => {
      setTime((prevTime) => prevTime + 1);
    }, 5000); // 5秒ごとに増える

    return () => clearInterval(interval); // ストップする
  }, []);

  return <p>時間: {time}秒</p>;
}

export default Timer;

ポイント

  • useEffect「特別なときに動くプログラム」
  • [] をつけると、1回だけ動く
  • タイマーや、ページが開いたときにデータをとる などに使える!

3. useLocation(現在のURLを取得)

React Router のフックで、現在のURL情報を取得 できる。
ページごとに異なる表示をしたいときに便利。

例: 現在のURLパスを表示

import { useLocation } from "react-router-dom";

function ShowLocation() {
  const location = useLocation();

  return <p>現在のURLパス: {location.pathname}</p>;
}

export default ShowLocation;

セットアップ

  • useLocation を使うには、アプリを BrowserRouter でラップ する。
import { BrowserRouter as Router, Route, Routes } from "react-router-dom";
import ShowLocation from "./ShowLocation";

function App() {
  return (
    <Router>
      <Routes>
        <Route path="/" element={<ShowLocation />} />
        <Route path="/about" element={<ShowLocation />} />
      </Routes>
    </Router>
  );
}

export default App;

ポイント

  • useLocation()現在のURL情報(location)を取得
  • location.pathname現在のパスを取得
小学生でも理解できるように説明してください。

useLocation(今どのページにいる?)

「今、どのページを見ている?」を調べることができるよ!

例:今のページを教えてくれる

import { useLocation } from "react-router-dom";

function ShowLocation() {
  const location = useLocation(); // 今のページを調べる

  return <p>今のページ: {location.pathname}</p>;
}

export default ShowLocation;

ポイント

  • useLocation() を使うと、今のページのURLがわかる!
  • たとえば http://example.com/about のとき、
    location.pathname"/about" になる!

4. useContext(グローバルなデータ共有)

コンポーネント間で データを共有 するためのフック。
useState だと 親 → 子 にしかデータを渡せない が、
useContext を使うと どのコンポーネントからでもデータを取得 できる。

例: ユーザー名をコンテキストで管理

import { createContext, useState, useContext } from "react";

// 1. Context を作成
const UserContext = createContext();

function UserProvider({ children }) {
  const [user, setUser] = useState("Alice"); // ユーザー名を管理

  return (
    <UserContext.Provider value={{ user, setUser }}>
      {children}
    </UserContext.Provider>
  );
}

// 2. コンテキストを利用するカスタムフック
function useUser() {
  return useContext(UserContext);
}

// 3. ユーザー情報を表示するコンポーネント
function UserProfile() {
  const { user, setUser } = useUser();

  return (
    <div>
      <p>現在のユーザー: {user}</p>
      <button onClick={() => setUser("Bob")}>Bob に変更</button>
    </div>
  );
}

// 4. アプリ全体でコンテキストを提供
function App() {
  return (
    <UserProvider>
      <UserProfile />
    </UserProvider>
  );
}

export default App;

ポイント

  • createContext()コンテキストを作成
  • UserProvider を作り、value={{ user, setUser }}データを提供
  • useContext(UserContext)データを取得
  • setUser("Bob")ユーザー名を変更可能
小学生でも理解できるように説明してください。

useContext(みんなでデータを共有!)

たとえば、ゲームで 「プレイヤーの名前」 を、いろんな画面で使いたい! というときに使えるよ。

例:「プレイヤーの名前」をどこでも使えるようにする!

import { createContext, useState, useContext } from "react";

// 1. プレイヤーの情報を作る
const PlayerContext = createContext();

function PlayerProvider({ children }) {
  const [player, setPlayer] = useState("たろう");

  return (
    <PlayerContext.Provider value={{ player, setPlayer }}>
      {children}
    </PlayerContext.Provider>
  );
}

// 2. プレイヤーの名前を使う
function PlayerInfo() {
  const { player, setPlayer } = useContext(PlayerContext);

  return (
    <div>
      <p>プレイヤーの名前: {player}</p>
      <button onClick={() => setPlayer("はなこ")}>名前を変える</button>
    </div>
  );
}

// 3. アプリでプレイヤーを共有
function App() {
  return (
    <PlayerProvider>
      <PlayerInfo />
    </PlayerProvider>
  );
}

export default App;

ポイント

  • createContext()「みんなで使えるデータ」 を作る!
  • useContext(PlayerContext)どこでもデータが使える
  • ゲームのプレイヤー名や、アプリのテーマ(暗いモード・明るいモード) などに使えるよ!

5. fetch(APIデータ取得)

fetch() は、外部APIからデータを取得するための関数。
通常、useEffect と組み合わせて使う。

例: API からデータ取得

import { useState, useEffect } from "react";

function FetchData() {
  const [data, setData] = useState(null);

  useEffect(() => {
    fetch("https://jsonplaceholder.typicode.com/todos/1") // APIリクエスト
      .then((response) => response.json()) // JSON に変換
      .then((json) => setData(json)) // 状態を更新
      .catch((error) => console.error("Error:", error)); // エラーハンドリング
  }, []);

  return <pre>{data ? JSON.stringify(data, null, 2) : "データ取得中..."}</pre>;
}

export default FetchData;

ポイント

  • fetch(URL) で API リクエスト
  • .then((response) => response.json())JSON に変換
  • .then((data) => setData(data))状態を更新
  • .catch((error) => console.error("Error:", error))エラー処理
小学生でも理解できるように説明してください。

fetch(インターネットからデータをもらう!)

fetch() を使うと、インターネットからデータをとってこれる!

たとえば、天気のデータやニュースのデータ をもらってくることができるよ。

例:ニュースをとってくる!

import { useState, useEffect } from "react";

function FetchData() {
  const [data, setData] = useState(null);

  useEffect(() => {
    fetch("https://jsonplaceholder.typicode.com/todos/1") // API からデータをもらう
      .then((response) => response.json()) // JSON にする
      .then((json) => setData(json)) // データを保存
      .catch((error) => console.error("エラー:", error));
  }, []);

  return <pre>{data ? JSON.stringify(data, null, 2) : "データ取得中..."}</pre>;
}

export default FetchData;

ポイント

  • fetch(URL)データをもらう
  • .then((response) => response.json())読みやすくする
  • .then((data) => setData(data))データを覚える
  • .catch((error) => ...)エラーが出たときに知らせる!

まとめ

フック / 関数役割補足
useState状態を管理(変数の更新で再レンダリング)ページの中で変わる数字や文字を覚える!
useEffect副作用(データ取得・イベント登録など)「ページが表示されたとき」などに動く!
useLocation現在のURL情報を取得(React Router)「今どのページ?」を知る!
useContextアプリ内でデータを共有(グローバルステート)「みんなでデータを使う!」
fetchAPI からデータを取得「インターネットからデータをもらう!」

どんなケースで使う?

例えば…

  • ページの状態管理useState
  • APIデータ取得fetch + useEffect
  • 現在のページの情報を取得useLocation
  • アプリ全体のデータ共有(例: ユーザー情報) → useContext

何か 試したいことや、実装したい機能 があれば教えて!

-Web Technologies, WebApp
-