カテゴリ: React 更新日: 2026/01/16

Reactのカスタムフックでデバウンス処理を実装する方法!初心者にもわかるステップ解説

カスタムフックでデバウンス処理を実装する方法
カスタムフックでデバウンス処理を実装する方法

先生と生徒の会話形式で理解しよう

生徒

「先生、デバウンス処理って何ですか?」

先生

「デバウンス処理は、短時間に何度も起こるイベントをまとめるためのテクニックです。」

生徒

「なんだか難しそうですね…。Reactでも使うことがあるんですか?」

先生

「もちろんです!フォームの入力やスクロールイベントなどでよく使われます。では、Reactでカスタムフックを使ってデバウンス処理を作る方法を一緒に見ていきましょう。」

1. デバウンス処理とは?

1. デバウンス処理とは?
1. デバウンス処理とは?

「デバウンス(debounce)」とは、ユーザーの操作が連続して行われたときに、最後の操作だけを実行するように制御する方法のことです。

例えば、検索ボックスに文字を入力するたびにサーバーへリクエストを送ると、無駄な通信が多く発生してしまいます。そこで、入力が止まってから一定時間が経過したときだけ検索を実行するようにするのが「デバウンス処理」です。

この仕組みを使うと、パフォーマンスの向上やサーバーへの負担軽減ができ、アプリがよりスムーズに動作します。

2. useDebounceカスタムフックを作ってみよう

2. useDebounceカスタムフックを作ってみよう
2. useDebounceカスタムフックを作ってみよう

Reactでは「カスタムフック」を使うことで、デバウンス処理を簡単に再利用できるようにできます。ここでは、入力値を一定時間待ってから反映するuseDebounceというカスタムフックを作ってみましょう。


import { useState, useEffect } from "react";

function useDebounce(value, delay) {
  const [debouncedValue, setDebouncedValue] = useState(value);

  useEffect(() => {
    const handler = setTimeout(() => {
      setDebouncedValue(value);
    }, delay);

    return () => {
      clearTimeout(handler);
    };
  }, [value, delay]);

  return debouncedValue;
}

export default useDebounce;

このカスタムフックは、value(入力された値)とdelay(待機時間)を受け取って、一定時間経過後に値を更新します。短時間で何度も値が変わった場合、タイマーをリセットして最新の値だけを反映します。

3. useDebounceを使って検索フォームを作る

3. useDebounceを使って検索フォームを作る
3. useDebounceを使って検索フォームを作る

次に、このカスタムフックを使って「入力が止まってから検索するフォーム」を作ってみましょう。


import React, { useState, useEffect } from "react";
import useDebounce from "./useDebounce";

function SearchInput() {
  const [query, setQuery] = useState("");
  const debouncedQuery = useDebounce(query, 500);

  useEffect(() => {
    if (debouncedQuery) {
      console.log("検索中:", debouncedQuery);
    }
  }, [debouncedQuery]);

  return (
    <div className="p-3">
      <input
        type="text"
        value={query}
        onChange={(e) => setQuery(e.target.value)}
        placeholder="検索ワードを入力"
        className="form-control"
      />
      <p className="mt-2">入力中の文字: {query}</p>
    </div>
  );
}

export default SearchInput;
(テキストボックスに文字を入力しても、入力が止まって0.5秒経過するまでは「検索中: ○○」が表示されません)

このようにすることで、ユーザーが文字を入力するたびに検索処理を行うのではなく、「入力が完了して少し待ってから」処理が実行されるようになります。

4. デバウンス処理のメリット

4. デバウンス処理のメリット
4. デバウンス処理のメリット

デバウンス処理を実装すると、アプリの動作がより軽くなります。たとえば以下のような場面で効果を発揮します。

  • 検索フォームでの入力中の無駄なAPI呼び出しを防ぐ
  • ウィンドウサイズの変更時に不要な再描画を防ぐ
  • スクロールイベントの処理を最適化する

つまり、「頻繁に変化するイベントを効率よく処理する」ための重要なテクニックなのです。

5. useDebounceの仕組みを詳しく解説

5. useDebounceの仕組みを詳しく解説
5. useDebounceの仕組みを詳しく解説

ここで、コードの動きをもう少し詳しく見てみましょう。

  • useState:最新の値を保持します。
  • useEffect:値が変化するたびにタイマーを設定します。
  • setTimeout:指定した時間が経過したら値を更新します。
  • clearTimeout:値が変更されたとき、前のタイマーをキャンセルします。

このように、タイマーを使って「最後の操作だけを反映する」仕組みがデバウンスです。

6. 実際の開発での活用例

6. 実際の開発での活用例
6. 実際の開発での活用例

実務では、デバウンス処理はAPI通信を最適化するためによく使われます。たとえば、ユーザーが検索バーで文字を入力するたびにサーバーへリクエストを送ってしまうと、通信量が増えて遅延が発生します。

しかしデバウンスを使えば、「入力が止まってから0.5秒後に1回だけ検索リクエストを送る」ようにでき、無駄な通信を減らせます。これにより、サーバーの負荷が軽くなり、ユーザー体験(UX)が向上します。

デバウンス処理を理解しておくと、Reactアプリのパフォーマンスを向上させる強力な武器になります。今回のようにカスタムフックを使えば、どんなコンポーネントでも簡単に再利用できます。

まとめ

まとめ
まとめ

Reactでデバウンス処理を実装する考え方は、アプリの動作をより軽快にし、ユーザーが快適に操作できる環境を整えるうえで非常に重要です。とくに、検索フォームやスクロールイベント、短時間で頻繁に発生する入力操作などは、ただ単にイベントを受け取って処理するだけでは、無駄な再描画やAPIリクエストが大量に発生してしまいます。こうした問題を防ぐために使われるのがデバウンスという仕組みで、一定時間操作が止まったと判断したところで初めて処理を実行することにより、動作の最適化や通信量削減につながります。 Reactではカスタムフックを活用することで、デバウンス処理をさまざまなコンポーネントで再利用でき、保守性や読みやすさも向上します。今回の記事で紹介したuseDebounceフックは、入力値が更新されるたびにタイマーをリセットし、最後に落ち着いた値だけを反映させるという仕組みをuseEffectsetTimeoutの組み合わせで実現していました。こうしたパターンはReactアプリの開発現場でも非常によく使われており、フォーム入力や検索フォーム、スクロール処理など、多くのUIイベントの最適化に役立っています。 さらに、デバウンスによってAPI通信が効率化されることで、サーバー負荷の軽減やレスポンス改善にもつながります。ユーザーが素早く入力を続けているときはリクエストを送らず、一定時間入力が止まってから一度だけ送信するため、無駄な通信が発生しません。この仕組みはモバイル環境や通信量が限られる場面でも非常に効果があり、快適なユーザー体験を維持するためにも欠かせない考え方です。 以下に、記事内容を踏まえた簡単なデバウンス応用コンポーネントをサンプルとして載せています。Reactでの理解を深めるための参考にしてください。

サンプルプログラム:デバウンス入力を使ったフォーム例


import React, { useState, useEffect } from "react";
import useDebounce from "./useDebounce";

function DebouncePreview() {
  const [text, setText] = useState("");
  const debouncedText = useDebounce(text, 600);

  useEffect(() => {
    if (debouncedText) {
      console.log("表示更新:", debouncedText);
    }
  }, [debouncedText]);

  return (
    <div className="card p-3 mb-3">
      <h2 className="fw-bold fs-4">デバウンス入力のプレビュー</h2>
      <input
        type="text"
        className="form-control"
        value={text}
        onChange={(e) => setText(e.target.value)}
        placeholder="文字を入力してください"
      />
      <p className="mt-2">入力中の文字: {text}</p>
      <p className="mt-1">デバウンス後の文字: {debouncedText}</p>
    </div>
  );
}

export default DebouncePreview;

上記のように、リアルタイムに入力が変わっても、デバウンスされた値は少し遅れて更新されます。この仕組みを活用することで、入力補完、検索候補の表示、負荷の高い再描画処理など、アプリ全体の操作性を維持しつつ必要な処理だけを効率よく実行できます。Reactのカスタムフックは柔軟で応用範囲が広く、デバウンス処理をはじめ、多様なロジックの共通化に役立ちます。 今回の内容を理解しておけば、今後より複雑なUIやイベント処理を行う場面でも、どこにデバウンスを入れるべきか判断できるようになり、より洗練されたReactアプリの実装が可能になります。

先生と生徒の振り返り会話

生徒

「デバウンスって、入力が止まるのを待って処理する仕組みだったんですね!実際にコードで見ると動きがよくわかりました。」

先生

「その通りです。短時間に何度も更新される値をそのまま使うと、アプリが重くなることがあります。だからデバウンスが必要なんですね。」

生徒

「カスタムフックで作ると、いろんな画面で再利用できるというのも便利でした!」

先生

「Reactではロジックを分離しておくと管理が楽になります。フォームや検索機能は特にデバウンスの恩恵が大きい場面ですね。」

生徒

「これなら検索フォームやスクロールイベントでも応用できそうです!今後の実装で使ってみます。」

先生

「ぜひ試してみてください。デバウンスを理解すれば、より快適で使いやすいReactアプリが作れるようになりますよ。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Reactで使われるデバウンス処理とは何ですか?

デバウンス処理とは、短時間に何度も発生するイベントに対して、最後の操作だけを実行するように制御する技術です。Reactでは、検索フォームやスクロールイベントなどでよく使われます。
カテゴリの一覧へ
新着記事
New1
React
Reactコンポーネントの再利用と分割を完全マスター!初心者でもわかるコンポーネント設計
New2
React
ReactでAxiosインターセプターの使い方を完全ガイド!初心者でもわかるリクエストとレスポンスの処理方法
New3
React
JSXの書き方!初心者でもわかるReactタグと属性の基本ルール解説
New4
React
ReactとDockerを使った開発環境構築の基本を徹底解説!初心者でもわかるReactとDockerの連携方法
人気記事
No.1
Java&Spring記事人気No1
React
ReactでonChangeイベントを使ってフォーム入力値を管理する方法を初心者向けに解説
No.2
Java&Spring記事人気No2
React
ReactとTypeScriptの環境構築をやさしく解説!Viteとtsconfigの設定も丁寧に紹介
No.3
Java&Spring記事人気No3
React
Reactのイベントハンドリングのアンチパターンまとめ!初心者でもわかる注意点
No.4
Java&Spring記事人気No4
React
Reactのカスタムフックの作り方を完全ガイド!再利用可能なロジックを切り出す仕組み
No.5
Java&Spring記事人気No5
React
ReactでFetch APIのローディング状態を管理する方法|初心者にもわかる解説
No.6
Java&Spring記事人気No6
React
create-react-appでReactプロジェクトを作成する手順を初心者向けに完全解説!
No.7
Java&Spring記事人気No7
React
ReactのuseStateとuseEffectでよくあるエラーと解決方法ガイド!初心者でもわかるReactフック
No.8
Java&Spring記事人気No8
React
Reactでファイルアップロードを実装する方法を解説!Fetch APIで画像やPDFを送る仕組みを初心者向けに紹介