LoginSignup
21
11

一瞬で理解!JavaScriptの`debounce`テクニックとその実装方法

Posted at

あなたがウェブサイトやアプリケーションを開発しているとき、高頻度で発火するイベントにどう対応すればよいか考えたことはありますか?この記事では、その問題を解決するためのdebounceテクニックについて紹介します!

目次

  1. debounceとは?
  2. debounceのメリット
  3. JavaScriptでのdebounceの実装
  4. 使用例と応用
  5. まとめ

1. debounceとは?

debounceは、高頻度で発火するイベント(例: ウィンドウのリサイズ、キー入力など)を制御するためのテクニックの一つです。このテクニックを使うと、特定の時間間隔内に再度イベントが発火しなかった場合にのみ関数を実行することができます。


2. debounceのメリット

  • パフォーマンスの向上: 不要な関数の実行を抑制することで、アプリケーションのパフォーマンスを向上させることができます。
  • APIのコスト削減: ユーザーの入力ごとにAPIを呼び出すのを防ぐことで、APIのリクエスト回数を減少させることができます。
  • ユーザーエクスペリエンスの向上: イベントの高頻度発火による不要な動作やアニメーションを避けることで、よりスムーズなユーザーエクスペリエンスを提供できます。

3. JavaScriptでのdebounceの実装

以下は、JavaScriptでのdebounce関数の実装例です。

function debounce(func, wait) {
    let timeout;
    return function(...args) {
        const context = this;
        clearTimeout(timeout);
        timeout = setTimeout(() => {
            func.apply(context, args);
        }, wait);
    };
}

4. 使用例と応用

4.1 ウィンドウのリサイズイベント

ウィンドウのリサイズイベントが高頻度で発火するのを防ぐ例です。

const debouncedFunction = debounce(() => {
    console.log('Debounced!');
}, 300);

window.addEventListener('resize', debouncedFunction);

この実装により、ウィンドウがリサイズされたときに300ミリ秒間何も発火しなかった場合のみ、console.log('Debounced!');が実行されます。

4.2 入力フォームとAPIリクエスト

ユーザーがテキスト入力をするたびにAPIリクエストを送るのを防ぐ例です。

const debouncedSearch = debounce((query) => {
    fetch(`https://api.example.com/search?q=${query}`)
        .then(response => response.json())
        .then(data => {
            // 結果の表示や処理
        });
}, 500);

document.querySelector('#search-input').addEventListener('input', (e) => {
    debouncedSearch(e.target.value);
});

5. まとめ

debounceは、高頻度で発火するイベントを制御するための非常に有用なテクニックです。このテクニックを活用することで、アプリケーションのパフォーマンスを向上させたり、ユーザーエクスペリエンスを向上させることができます。是非、あなたのプロジェクトにも取り入れてみてください!


以上、debounceテクニックについての解説でした。この記事が役立ったら、いいねやコメントをお願いします!


21
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
11