デバウンス付き非同期候補
ユーザーの入力中にAPIから候補を取得し、過剰なネットワークリクエストを避けるためデバウンスします
「デバウンス付き非同期候補」はCoddyKit上の無料React Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。
静的なフィルターをAPIフェッチに置き換える
ローカル配列をフィルタリングする代わりに、クエリに基づいて一致する候補を返すAPIエンドポイントを呼び出します。API呼び出しは、デバウンス済みの入力値に依存するuseEffectに記述します。これによりフィルタリングの責任をサーバーに移し、あいまい検索、ランキング、より大規模なデータセットからの候補提示が可能になります。
ローディングとエラー用の新しい状態
オートコンプリートに2つの新しい状態変数を追加します。isLoading(ブール値)はフェッチ中にスピナーを表示するために使い、error(文字列またはnull)はフェッチに失敗したときにエラーメッセージを表示するために使います。これにより、候補が表示されない理由が分からないままになるのではなく、非同期処理の状況をユーザーに伝えられます。
フェッチ用のエフェクト
フェッチ用のuseEffectでは、開始時にsetIsLoading(true)とsetError(null)を設定し、その後fetch(url)を実行してJSONを解析し、setSuggestions(data)を呼び出します。最後に、finallyブロック内、または成功時とエラー時の両方の処理の後でsetIsLoading(false)を実行します。エフェクトの依存配列にはdebouncedInputValueだけを含めます。
AbortControllerを使用したリクエストのキャンセル
エフェクトの先頭で新しいAbortControllerを作成し、フェッチのオプションにcontroller.signalを渡します。クリーンアップ関数ではcontroller.abort()を呼び出します。ユーザーが入力してデバウンス済みの値が変わると、前のフェッチは新しいフェッチが始まる前に中止されるため、古い結果が順不同で届くのを防げます。
中止エラーの処理
フェッチが中止されると、AbortErrorという名前のDOMExceptionを伴って拒否されます。catchブロックでif (err.name === 'AbortError') return;を確認し、中止されたフェッチは何も表示せずに無視します。ユーザーに表示すべき本当のネットワークエラーやAPIエラーだけを処理します。
isLoadingの状態管理
フェッチの前にisLoadingをtrueに設定し、フェッチが解決または拒否された後にfalseへ戻します。必ずリセットされるように、finallyブロックを使います。例:fetch(url).then(...).catch(...).finally(() => setIsLoading(false))。finallyブロックがないと、フェッチエラーが発生したときにスピナーが永遠に表示され続けます。
ドロップダウンのローディングスピナー
isLoadingがtrueで、入力欄に文字がある場合は、候補リストの代わりに中央揃えのスピナーを内部に表示したドロップダウンを表示します。これにより、結果を取得中であることをユーザーに伝えられます。ローディングがfalseになって候補が届いたら、スピナーを実際の候補項目に置き換えます。
ドロップダウンのエラー状態
errorがnullでない場合は、候補の代わりにエラーメッセージを表示したドロップダウンを表示します。「候補を読み込めませんでした。もう一度お試しください。」のようなメッセージのほうが、エラー文字列をそのまま表示するより親切です。必要に応じて、フェッチを手動で再実行する再試行ボタンを追加します。
最小文字数のしきい値
空文字列や、無関係な結果が多くなりすぎる短いクエリに対してはフェッチしないようにします。エフェクトの先頭で次のようにガードします:if (debouncedInputValue.length < 2) { setSuggestions([]); return; }。これにより不要なAPI呼び出しを減らし、1文字だけの入力で結果が大量に表示されるのを防げます。
取得結果のキャッシュ
取得した結果をuseRefのMapに保存します:const cache = useRef(new Map())。フェッチする前にif (cache.current.has(query)) { setSuggestions(cache.current.get(query)); return; }で確認します。フェッチが成功したら結果を保存します。これにより、ユーザーがすでに入力したクエリに対する重複したネットワークリクエストをなくせます。
推奨されるデバウンス遅延
特にオートコンプリートでは、デバウンス遅延を200~300msにするのが最適です。短すぎる遅延(200ms未満)では、入力の速いユーザーに対してリクエストが多すぎます。長すぎる遅延(400ms超)では、候補の表示が遅く、反応が鈍く感じられます。250msは、実運用のオートコンプリート実装でよく使われるデフォルト値です。
オートコンプリートにおけるAbortController
APIからフェッチするデバウンス済みオートコンプリートで、AbortControllerが重要なのはなぜですか?
レッスンのまとめ:デバウンスを使った非同期候補提示
静的なフィルタリングを、デバウンス済みの値に依存するuseEffect内のAPIフェッチに置き換えます。AbortControllerを使って古いリクエストをキャンセルします。ユーザーへのフィードバック用にisLoadingとerrorの状態を追加します。過剰な呼び出しを避けるため、最小文字数のしきい値を設定します。結果をrefにキャッシュし、重複したネットワークリクエストを省略します。
よくある質問
「デバウンス付き非同期候補」レッスンは無料ですか?
はい。「デバウンス付き非同期候補」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。
「デバウンス付き非同期候補」で何を学びますか?
ユーザーの入力中にAPIから候補を取得し、過剰なネットワークリクエストを避けるためデバウンスします ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
React Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「デバウンス付き非同期候補」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このReact Academyレッスンでコードを書いて実行できますか?
はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。