第32章:【フック】useState の基本。
この章では、Reactのいちばん大事なフック「useState」 をマスターします✨
ここを乗り越えると、
- ボタンを押したら数字が増える
- 入力した文字がその場で表示される
- ON / OFF の切り替えスイッチを作る
みたいな「動くUI」がサクサク作れるようになります🧸💫
1️⃣ フックってなに?useStateってなに?🤔
まず言葉の整理からいきましょ。
-
フック(Hook) → React に「これ使ってね〜」と用意されてる、特別な関数のこと。 →
useState,useEffect,useRefなど、だいたいuseから始まるよ🪝 -
useState→ コンポーネントの中に「変わる値(状態 / State)」を持たせるためのフック。 → 普通のlet変数と違って、値が変わると自動で画面を描き直してくれるのがポイント🌈
イメージとしては、
「Reactさん、このコンポーネントで、 変わる値をひとつ管理したいのでお願いします〜🙏」
ってお願いするための関数、みたいな感じです😊
2️⃣ 一番シンプルな useState の使い方 🧪
さっそく、ボタンを押すと数字が増えるカウンターを作ってみましょう🎉
🔧 手順:App.tsx を書きかえる
VS Code で src/App.tsx を開いて、いったん中身を全部消してから、次のように書きかえてみてください👇
import { useState } from "react";
function App() {
const [count, setCount] = useState(0);
function handleClick() {
setCount(count + 1);
}
return (
<div style={{ padding: "24px", fontFamily: "sans-serif" }}>
<h1>カウンター ✨</h1>
<p>今のカウント:{count}</p>
<button onClick={handleClick}>+1 する</button>
</div>
);
}
export default App;
ブラウザで npm run dev の画面を開いて、ボタンをポチポチしてみてください👇
→ 数字が「0, 1, 2, 3, …」と増えていけば成功です🙌
3️⃣ お約束の一行を分解して理解する🔍
さっきのコードの中の、この一行が主役です👇
const [count, setCount] = useState(0);
これをパーツごとに見ていきます💡
🧩 useState(0) の意味
-
useState(0)の0は、「最初の値」(初期値)です。- 今回は「カウンターなので最初は 0」って感じ。
- ここに
"hello"と書けば、最初の状態は"hello"になります。
🧩 [count, setCount] の意味(配列の分割代入)
useState は、「2つ入った配列」みたいなものを返してきます。
- 1つ目 → 今の値(Stateそのもの)
- 2つ目 → その値を更新するための関数
それを 配列の分割代入 で受け取ってるのがコレです👇
count→ 「今のカウントの値」を入れておく変数(読み取り用)📊setCount→ 「カウントの値を変えたいときに呼ぶ関数」🛎
なので、
setCount(count + 1);
と書くと、
「今の
countに 1 足した値を、次の状態として React にお願いする」
という意味になります🎀
4️⃣ ふつうの変数と、Stateの違い ✋
JavaScript だけの世界なら、こんなコードでもカウンターっぽいことができますよね:
let count = 0;
count = count + 1;
でも React コンポーネントの中で、
let count = 0;
function handleClick() {
count = count + 1;
}
みたいに書いても、画面は更新されません❌ なぜかというと…React は
「
useStateで管理している値が変わったとき」
しか、画面を描きなおしに行かないからです💻✨
useState を使うと:
- 値を変えたい →
setCount(...)を呼ぶ - React が「お、変わったな?」と気づく
- そのコンポーネントを もう一度関数として呼び直す
- 新しい
countの値で JSX が作り直される - 画面の表示が変わる 🎉
5️⃣ 動き方を図でイメージしてみよう 🧠✨
useState を使ったときの流れを、Mermaid で図解してみます🪄
頭の中では、
「
setCountを呼ぶと、React がもう一回コンポーネントを実行してくれるんだな〜」
くらいのイメージで OK です👌
6️⃣ useState を使うときのルール ⚠️
useState はちょっとお行儀にうるさい子なので、ルールもセットで覚えましょう🐈⬛
✅ ルール1:コンポーネントの「トップレベル」で呼ぶ
ダメな例(if の中で使ってる):
function App() {
if (Math.random() > 0.5) {
const [count, setCount] = useState(0); // ❌ NG
}
return <div>...</div>;
}
OKな例(コンポーネントの一番上で呼ぶ):
function App() {
const [count, setCount] = useState(0); // ✅ ここ!
// ここから下に if やイベントハンドラを書くのは OK
// ...
return <div>...</div>;
}
「コンポーネントの中のいちばん上のほうで、素直に呼ぶ」 って覚えておけば今は大丈夫です🌸
✅ ルール2:普通の関数ではなく、「コンポーネント or カスタムフック」の中で使う
// ファイルの一番外側(グローバル)ではダメ
const [count, setCount] = useState(0); // ❌ これは NG
useState は、
- React コンポーネントの中
- もしくは、あとで出てくるカスタムフックの中
でだけ使える特別な関数です🌟
7️⃣ ミニ練習:自分の「いいね❤️」カウンターを作ろう
今のカウンターを、ちょっとアレンジしてみましょう🎨
🎯 お題
- 「
いいね!❤️ボタン」と - 「押された回数」を表示するコンポーネントを作る
たとえば、こんな感じに動いたらOKです👇
- 最初は
0 いいね - ボタンを押すたびに
1 いいね,2 いいね, …
🧪 ヒントコード
App.tsx をこんなふうに書きかえてみてください(全部マネしてから、自分好みに文言を変えてみるのもおすすめ💖)
import { useState } from "react";
function App() {
const [likes, setLikes] = useState(0);
function handleLike() {
setLikes(likes + 1);
}
return (
<div style={{ padding: "24px", fontFamily: "sans-serif" }}>
<h1>いいねカウンター ❤️</h1>
<p>{likes} いいね</p>
<button onClick={handleLike}>いいね!</button>
</div>
);
}
export default App;
✏️ アレンジしてみよう
余裕があれば、こんなアレンジもやってみてください✨
- テキストを
→
今日の私へのごほうび 💎:{likes} ポイントに変えてみる - ボタンのラベルを
→
ポイントを増やすに変えてみる styleを少し変えて、文字を大きくしてみる(fontSize: "20px"など)
8️⃣ この章のおさらい 🐾
-
useStateは、変わる値(State)をコンポーネントに持たせるフック🪝 -
const [value, setValue] = useState(初期値);という形で、「今の値」と「更新用の関数」をセットでもらう -
setValue(...)を呼ぶと、React がコンポーネントをもう一度実行して、 新しい値で画面を更新してくれる -
ルール:
- コンポーネントのトップレベルで呼ぶ
- コンポーネント or カスタムフックの中だけで使う
次の章では、TypeScript ならではの 「型推論と useState」 を見ていきます📐✨
「型が勝手についてくれるってどういうこと?」を、いっしょに体験していきましょう〜🙌