0Pricing
React Academy · レッスン

候補リスト付きの制御入力

基礎として、入力内容を制御し、下に絞り込み済みの候補ドロップダウンを表示するUIを構築します

「候補リスト付きの制御入力」はCoddyKit上の無料React Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。

コンポーネント構造の概要

自動補完コンポーネントは、主に2つの部分で構成されます。制御されたテキスト入力と、候補を表示するドロップダウンリストです。入力欄は通常のドキュメントフローに置き、ドロップダウンはその直下に絶対配置します。これらは別々のDOM要素ですが、組み合わせることで1つのインタラクティブなウィジェットとして機能します。

必要な状態変数

4つの状態変数が必要です。inputValue(string — 入力された文字列)、suggestions(array — 現在一致している項目)、isOpen(boolean — ドロップダウンを表示するかどうか)、selectedIndex(number — キーボード操作で強調表示する候補の位置。何も選択されていない場合は -1 で開始)です。

入力欄の制御

入力欄を完全に制御された状態にします。value={inputValue} と onChange={e => setInputValue(e.target.value)} を指定してください。これにより、表示されるテキストをReactが完全に制御できます。キーを1つ入力するたびに状態が更新され、新しい値で再レンダーが発生します。自動補完に非制御入力を使用してはいけません。値をプログラムから読み取って設定する必要があるためです。

静的リストからのフィルタリング

候補がローカル配列にある場合は、各レンダーで inputValue に基づいてフィルタリングします。item.toLowerCase().includes(inputValue.toLowerCase()) を使って各項目を比較してください。リストが大きい場合は、useMemo で計算して、再レンダーのたびに再計算されるのを防げます。小さなリストであれば、インラインでフィルタリングしても問題ありません。

ドロップダウンの表示と非表示

inputValue.length > 0 かつ suggestions.length > 0 のときにドロップダウンを開きます。入力欄がフォーカスを失ったとき(候補のクリックを先に処理できるよう、少し遅延させます)、候補が選択されたとき、またはEscapeキーが押されたときに閉じます。isOpen を適切に設定し、条件付きレンダーを制御してください。

遅延を設けたBlurの処理

onBlur イベントは、入力欄がフォーカスを失ったときに発火します。候補をクリックした場合もこれに該当します。Blur時にすぐドロップダウンを閉じると、クリックイベントが発火する前にドロップダウンが消えるため、候補のクリックが処理されません。setTimeout(() => setIsOpen(false), 150) を使い、クリックが処理される時間を確保してください。

ドロップダウンのスタイル設定

ドロップダウンには position: absolute を指定し、入力欄の下にあるコンテンツを押し下げるのではなく、その上に重ねて表示します。他のコンテンツより上に表示されるよう、高い z-index(100以上)を設定します。多くの結果がある場合にリストが高くなりすぎないよう、overflow-y: auto とともに max-height を設定します。

候補をクリック可能にする

各候補項目に onClick ハンドラーを設定します。onClick={() => { setInputValue(suggestion); setIsOpen(false); }} のように記述してください。これにより、入力欄に選択した候補が設定され、ドロップダウンが閉じます。選択がすぐに反映されるため、自動補完フィールドにユーザーが期待する自然な操作感になります。

クリック前のBlurを防ぐ

Blurのタイムアウトを使う代わりに、各候補項目で onMouseDown={e => e.preventDefault()} を使う方法もあります。これにより、mousedownによって入力欄からフォーカスが奪われるのを防げるため、候補をクリックしてもBlurイベントが発火しません。入力欄はフォーカスを維持し、クリックハンドラーも正しく発火します。

キーボード操作の概要

優れた自動補完は、キーボードで操作できなければなりません。ユーザーはArrowDownを押して最初の候補を強調表示し、続けて押してリストを下へ移動し、Enterで選択し、Escapeで選択せずに閉じられる必要があります。これは入力要素の onKeyDown を処理することで実装します。

入力変更時のselectedIndexのリセット

ユーザーが入力して inputValue が変わるたびに、selectedIndex を -1 にリセットします。これにより以前のキーボード選択が解除され、新しくフィルタリングされた候補は何も強調表示されていない状態から始まります。リストの変更後も古い選択インデックスが別の項目を指していると、混乱を招き、正しくありません。

BlurとMouseDownのイベント順序

Blurのタイムアウトに頼るのではなく、候補項目で e.preventDefault() とともに onMouseDown を使うのはなぜですか?

レッスンのまとめ: 候補付きの制御された入力

自動補完ウィジェットには、inputValue、suggestions、isOpen、selectedIndexの4つの状態変数が必要です。制御された入力を使い、入力値に基づいて候補をフィルタリングし、isOpenでドロップダウンの表示を管理します。Blurがクリックより先に発火する競合状態には、タイムアウトまたはonMouseDownのpreventDefaultのいずれかで対処します。入力が変わるたびにselectedIndexをリセットしてください。

よくある質問

「候補リスト付きの制御入力」レッスンは無料ですか?

はい。「候補リスト付きの制御入力」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。

「候補リスト付きの制御入力」で何を学びますか?

基礎として、入力内容を制御し、下に絞り込み済みの候補ドロップダウンを表示するUIを構築します ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

React Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「候補リスト付きの制御入力」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このReact Academyレッスンでコードを書いて実行できますか?

はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 候補リスト付きの制御入力
  2. 候補リストのキーボードナビゲーション
  3. デバウンス付き非同期候補
  4. オートコンプリートウィジェットのアクセシビリティ
← React Academyに戻る