Web制作

Next.jsで使うreact hooksの正しい書き方

アイキャッチ画像 Web制作

Next.jsでReact Hooksを使いこなしたい方へ
この記事では、Next.jsの環境でReact Hooks(useState、useEffectなど)を正しく、迷わず使う方法をシンプルに解説します。基本の書き方から注意点まで、実践に役立つ内容をまとめました。

この記事はこんな人にオススメ!

下記の方におすすめ
  • Next.jsでHooksをどう使うか迷っている方
  • useEffectやuseRefの挙動に戸惑ったことがある方
  • クライアント・サーバーの違いに自信がない方

基本をしっかり押さえたい方に向けて、丁寧にご紹介していきます。

React Hooksとは?Next.jsで使う前に

React Hooksは、Reactの関数コンポーネントで状態管理や副作用処理を可能にする機能です。Next.jsでも同様に使用できますが、App Routerやコンポーネントの種類によって制限があるため、導入前に理解しておくことが大切です。

React Hooksの基本とは?

  • useState:状態を保持する
  • useEffect:副作用(例:データ取得、タイマーなど)を扱う
  • useRef:再レンダリングせずに値を保持する、またはDOM参照に使う

これらはすべて、コンポーネント関数のトップレベルでのみ使用する必要があります。

Next.jsでの位置づけと注意点

Next.jsでは、ページ・コンポーネントごとに「クライアント or サーバー」の区別があります。Hooksはクライアントコンポーネントでのみ使用可能です。

App Routerとの関係性

App Router(app/ディレクトリ構成)では、デフォルトで各ファイルがサーバーコンポーネントとして扱われるため、Hooksは使えません。必要があれば明示的にクライアントとして指定します。

use client 指定の意味

コンポーネントファイルの最上部に以下を記述します:

'use client';

これにより、そのファイルがクライアントコンポーネントとして実行され、Hooksが使用できるようになります。

Next.jsでReact Hooksを使う基本構文

Next.jsでもReact Hooksの基本構文は同じです。ただし、クライアントで動くように設計することが前提となります。

useStateの基本的な使い方

const [count, setCount] = useState(0);
  • count:現在の状態
  • setCount:状態を更新する関数
  • 0:初期値

useEffectで副作用を扱う流れ

副作用とは、データ取得、イベントリスナー登録、タイマー設定など。Reactでは useEffect を使って書きます。

useEffect(() => {
console.log('初回のみ実行');
}, []);

依存配列の役割と使い方

  • []:初回マウント時のみ実行
  • [value]value が変更されたときに再実行
  • 省略:毎回レンダリング後に実行(推奨されない)

クリーンアップ関数の書き方

副作用の後始末(例:イベントの解除)には、return で関数を返します:

useEffect(() => {
const onScroll = () => console.log('scrolling');
window.addEventListener('scroll', onScroll);
return () => window.removeEventListener('scroll', onScroll);
}, []);

クライアントコンポーネントとHooksの関係

Next.jsのクライアントコンポーネントでは、通常のReact Hooksが使えます。ここでは主に useRefuseMemouseCallback などの応用的な使い方に焦点を当てます。

useRef・useMemoなどの使いどころ

  • useRef:DOM要素の参照、または値の保持(再レンダリングしない)
  • useMemo:重い計算をメモ化してパフォーマンス最適化

例:

const result = useMemo(() => heavyCalc(input), [input]);

クライアントでのデータ取得の考え方

クライアントでのデータ取得は useEffectuseSWR を使うのが一般的です。

useEffect × fetch の基本形

useEffect(() => {
const loadData = async () => {
const res = await fetch('/api/data');
const json = await res.json();
setData(json);
};
loadData();
}, []);

useSWRとの違いと選び方

useSWR は「データ取得+キャッシュ+再取得」を簡潔に実現できるHooksライブラリです。

  • useEffect: 素朴な fetch 処理(手動制御)
  • useSWR: 自動リトライ・キャッシュ・再検証付き

よく使うHooksの使い方と注意点

useRefとDOM操作の基本

const inputRef = useRef<HTMLInputElement>(null);
return <input ref={inputRef} />;
  • フォーカス制御や高さ取得に便利
  • 状態変更なしに情報を保持できる

useCallbackで関数の無駄を減らす

再レンダリング時に関数が毎回再定義されるのを防ぎます。

const handleClick = useCallback(() => {
console.log('clicked');
}, []);

useMemoで処理の最適化を図る

重い計算処理の結果をキャッシュし、依存配列が変わったときのみ再評価されます。

const result = useMemo(() => expensiveCalc(data), [data]);

サーバーコンポーネントとの使い分け

サーバーコンポーネントではHooksが使えない理由

Reactのサーバーコンポーネントは「レンダリング専用」で、クライアント状態やイベントは扱いません。よって useStateuseEffect は使用できません。

Hooksを使いたい場合の分離の考え方

Container/Presentationalパターンの活用

  • Containeruse client で Hooks を使う
  • Presentational:状態を受け取ってUIに描画するだけ

この分離により、責務を明確にして保守性が上がります。

よくあるエラーとつまずきポイント

useEffectが動かないときの対処法

  • use client をつけていない
  • 依存配列が誤っている
  • 非同期関数を直接 useEffect に渡している(関数の中で定義すべき)

Hydrationエラーの原因と回避方法

サーバーとクライアントの描画内容が不一致だと Hydration error になります。以下で回避できます:

  • クライアント限定処理は useEffect 内に書く
  • 初期値とクライアント値の差異を避ける

「Hooksはトップレベルでのみ呼び出す」エラーの理解

以下のように、条件分岐やループ内では使用できません:

if (isEnabled) {
useEffect(() => {}, []); // ❌ NG
}

Hooksは常に関数の最上位スコープで宣言する必要があります。

よく使われるReact Hooks一覧【早見表】

Next.jsで使えるReact Hooksの中でも、特に登場頻度が高いものを簡単にまとめます。

フック名用途の概要
useStateコンポーネント内で状態を保持する
useEffect副作用(データ取得やイベント登録)処理
useRefDOM参照やミューテーブルな値の保持
useMemo計算結果のメモ化によるパフォーマンス最適化
useCallback関数のメモ化で再定義を防ぐ
useContextグローバルな状態やテーマの共有
useReduceruseStateより複雑な状態遷移に対応
useLayoutEffectDOM更新直後に処理を行いたい場合に使用
useId一意なIDを生成する
useTransitionUI更新の優先度を制御する(並列処理)

まとめと次に学びたいステップ

この記事のまとめ

  • Hooksはクライアントコンポーネントでのみ使える
  • useState, useEffect, useRef は基本中の基本
  • App Routerでは use client 指定を忘れずに
  • サーバーコンポーネントとの使い分けも重要

次に学ぶべきおすすめのトピック

カスタムフックの作り方

再利用可能なロジックを切り出すことで、コードの可読性と保守性を高められます。

状態管理ライブラリとの連携(例:Jotai, Zustand)

アプリ全体で状態を共有したい場合は、軽量な状態管理ライブラリとの組み合わせが効果的です。

コメント

タイトルとURLをコピーしました