オートコンプリート

オートコンプリートは、テキスト入力とリストボックスを組み合わせたもので、ユーザーはクエリに一致する項目に対してオプションのリストをフィルター処理できます。


インストール

npx nextui-cli@latest add autocomplete
上記のコマンドは、個別のインストールのみを対象としています。もし、 @nextui-org/react がグローバルにインストール済みの場合は、このステップをスキップできます。

インポート

NextUIは、オートコンプリート関連の3つのコンポーネントをエクスポートします。

  • Autocomplete:メインコンポーネントで、他のコンポーネントのラッパーです。
  • AutocompleteSection:オートコンプリート項目のグループを含むコンポーネントです。
  • AutocompleteItem:オートコンプリート項目を表すコンポーネントです。

使い方

動的な項目

Autocompleteは、Collection Components APIに従い、静的および動的なコレクションの両方を受け入れます。

  • 静的:上記の利用例は、オプションの完全なリストが事前にわかっている場合に使用できる静的な実装を示しています。
  • 動的:以下の例は、オプションがAPI呼び出しなどの外部データソースから取得される場合や、時間とともに更新される場合に使用できます。

無効

無効な項目

disabledKeys プロパティを使用して、特定の項目を無効にできます。

必須

オートコンプリートにisRequiredプロパティを渡すと、ラベルの末尾にdangerのアスタリスクが表示され、オートコンプリートが必須になります。

読み取り専用

AutocompleteにisReadOnlyプロパティを渡すと、Listboxが開き、利用可能なすべてのオプションが表示されますが、ユーザーはリストされたオプションをどれも選択できなくなります。

サイズ

バリアント

ラベルの配置

labelPlacementプロパティをinsideoutside、またはoutside-leftに設定すると、ラベルの位置を変更できます。

注意labelが渡されない場合、labelPlacementプロパティはデフォルトでoutsideになります。

開始コンテンツ

startContentおよびendContentプロパティを使用して、オートコンプリートの開始と終了にコンテンツを追加できます。

項目の開始および終了コンテンツ

Autocompleteコンポーネントは内部でListboxコンポーネントを使用しているため、AutocompleteItemコンポーネントのstartContentおよびendContentプロパティを使用して、オートコンプリート項目の開始と終了にコンテンツを追加できます。

カスタム値

デフォルトでは、Autocomplete は、オプションリストに存在しない値をユーザーが指定することを許可せず、フォーカスが外れると入力値を現在選択されている値に戻します。allowsCustomValue を指定すると、この動作は抑制され、ユーザーはフィールド内に任意の値を入れることができます。

カスタムセレクターアイコン

デフォルトでは、Autocomplete は、セレクターアイコンとして chevron-down アイコンを使用し、オートコンプリートが開いているときに回転します。このアイコンは、selectorIcon プロパティにカスタムアイコンを渡すことでカスタマイズできます。

: アイコンの回転を無効にするには、disableSelectorIconRotation プロパティを使用してください。

スクロールシャドウなし

Autocomplete コンポーネントは、内部で ScrollShadow を使用して、オートコンプリートの内容がスクロール可能である場合に影を表示します。この影は、scrollShadowProps プロパティを使用することで無効にできます。

: スクロールインジケーターを無効にするには、showScrollIndicators プロパティを使用することもできます。

説明付き

description プロパティを渡すことで、オートコンプリートに説明を追加できます。

エラーメッセージ付き

isInvalid プロパティと errorMessage プロパティを組み合わせることで、無効なオートコンプリートを表示できます。

イベント

Autocomplete コンポーネントは、マウス、キーボード、タッチによる選択をサポートしています。これらはすべて onSelectionChange プロパティで処理できます。Autocomplete は、選択されたキーを onSelectionChange ハンドラーに渡します。さらに、ComboBox は onInputChange プロパティを受け入れます。これは、タイピングやオプションの選択など、ユーザーが値を編集するたびにトリガーされます。

以下の例では、onSelectionChangeonInputChange を使用して、React の状態に格納された選択と入力値を更新します。

制御された状態

選択された値を制御するには、selectedKey プロパティと onSelectionChange プロパティを使用できます。

完全に制御された状態

inputValueselectedKey、および itemsAutocomplete に渡すことで、Autocomplete が表示する内容を正確に制御できます。

次の例は、選択された値 selectedKey からコンボボックスオプション items まで、すべてを制御する、制御された Autocomplete を作成する方法を示しています。

アイテムのフィルタリングを管理するには、@react-aria/i18nuseFilter フックを使用することをお勧めします。

npm install @react-aria/i18n
import {useFilter} from "@react-aria/i18n";

: Autocomplete のすべての側面を制御する必要はないことに注意してください。Autocomplete の 1 つのプロパティのみを制御する場合は、そのプロパティの変更ハンドラーも必ず提供してください。例えば、selectedKey を制御するには、onSelectionChange が必要になります。

カスタムアイテム

AutocompleteItem の子を修正することで、オートコンプリートアイテムをカスタマイズできます。

カスタムの空コンテンツメッセージ

デフォルトでは、フィルターを使用したクエリに一致する結果がない場合、No results found. というメッセージが表示されます。 listboxPropsemptyContent を変更することで、空コンテンツメッセージをカスタマイズできます。

カスタムフィルタリング

デフォルトでは、Autocomplete は、オプションのリストをフィルタリングするために useFilter からの "contains" 関数を使用します。これは、defaultFilter プロパティを使用するか、items プロパティを使用してフィルタリングされたリストを制御することで上書きできます。defaultItems ではなく items が指定されている場合、Autocomplete 自体はフィルタリングを行いません。

次の例では、カスタムフィルタ関数を使用してオプションのリストをフィルタリングするために、defaultFilter プロパティを使用しています。

非同期フィルタリング

Autocomplete は非同期フィルタリングをサポートしています。以下の例では、useAsyncList 関数を react-aria から使用して、サーバーからのデータの非同期ロードとフィルタリングを処理しています。

npm install @react-stately/data
import {useAsyncList} from "@react-stately/data";

非同期ロード

Autocomplete は非同期ロードをサポートしています。以下の例では、カスタムフックを使用して Pokemon API データを取得し、useInfiniteScroll フックと組み合わせて、ユーザーがリストの最後に到達したときに追加のデータをロードしています。

isLoading プロパティは、データのフェッチ中にセレクターアイコンの代わりにロードインジケーターを表示するために使用されます。

npm install @nextui-org/use-infinite-scroll
import {useInfiniteScroll} from "@nextui-org/use-infinite-scroll";

セクション付き

AutocompleteSection コンポーネントを使用して、オートコンプリートアイテムをグループ化できます。

カスタムセクションスタイル

AutocompleteSection コンポーネントの classNames プロパティを使用することで、セクションのスタイルをカスタマイズできます。

オートコンプリートのカスタマイズ

classNames プロパティを使用することで、オートコンプリートの任意のスロットをカスタマイズできます。オートコンプリートコンポーネントは、ポップオーバー、リストボックス、および入力コンポーネントをカスタマイズするための popoverPropslistboxPropsinputProps プロパティも提供します。

スロット

  • base: オートコンプリートのメインラッパー。これは、入力コンポーネントとポップオーバーコンポーネントをラップします。
  • listboxWrapper: リストボックスのラッパー。これはリストボックスコンポーネントをラップし、このスロットはスクロールシャドウコンポーネントの上部で使用されます。
  • listbox: リストボックスコンポーネント。これはオートコンプリートアイテムをラップするコンポーネントです。
  • popoverContent: ポップオーバーコンテンツのスロット。ポップオーバーのコンテンツスタイルを変更するために使用します。
  • endContentWrapper: エンドコンテンツのラッパー。クリアボタンとセレクターボタンをラップします。
  • clearButton: クリアボタンのスロット。
  • selectorButton: セレクターボタンのスロット。

データ属性

Autocompletebase 要素には、以下の属性があります。

  • data-invalid: オートコンプリートが無効な場合。isInvalid プロパティに基づきます。
  • data-open: オートコンプリートのポップオーバーが開いているかどうかを示します。

AutocompleteselectorButton 要素には、以下の属性があります。

  • data-open: オートコンプリートのポップオーバーが開いているかどうかを示します。

AutocompleteclearButton 要素には、以下の属性があります。

  • data-visible: オートコンプリートのクリアボタンが表示されるかどうかを示します。デフォルトでは、オートコンプリートにカーソルを合わせたとき、およびオートコンプリートに値があるとき(デスクトップ)、またはオートコンプリートに値があるとき(モバイル)に表示されます。

AutocompleteItembase 要素には、以下の属性があります。

  • data-disabled: オートコンプリートの項目が無効な場合。オートコンプリートの disabledKeys プロパティに基づきます。
  • data-selected: オートコンプリートの項目が選択されている場合。オートコンプリートの selectedKey プロパティに基づきます。
  • data-hover: オートコンプリートの項目にカーソルが合わされている場合。useHoverに基づきます。
  • data-pressed: オートコンプリートの項目が押されている場合。usePressに基づきます。
  • data-focus: オートコンプリートの項目がフォーカスされている場合。useFocusRingに基づきます。
  • data-focus-visible: オートコンプリートの項目がキーボードでフォーカスされている場合。useFocusRingに基づきます。

アクセシビリティ

  • 入力によるオプションリストのフィルタリングをサポート
  • 単一のオプションの選択をサポート
  • 無効なオプションのサポート
  • セクション内の項目のグループのサポート
  • カスタムユーザー入力値のサポート
  • 制御されたオプションと制御されていないオプション、選択、入力値、およびオープン状態のサポート
  • カスタムフィルター関数のサポート
  • 非同期ロードと無限スクロールのサポート
  • 長いリストでのパフォーマンスのための仮想化スクロールのサポート
  • ARIAを使用したコンボボックスとして支援技術に公開
  • アクセシビリティのためのラベル付けのサポート
  • ARIAを介して支援技術に公開される必須および無効な状態
  • マウス、タッチ、およびキーボード操作のサポート
  • 矢印キーを使用してコンボボックスのリストボックスを開くためのキーボードサポート。それに応じて最初または最後の項目を自動的にフォーカスすることを含む
  • 入力時、フォーカス時、または手動でリストボックスを開くためのサポート
  • タッチスクリーンリーダーからの入力を仮想クリックして、リストボックスを切り替える
  • コンボボックスリストボックスのオプションナビゲーションのための仮想フォーカスマネジメント
  • リストボックスがポータルで開いている間、入力とリストボックスの外側の要素を支援技術から非表示にする
  • VoiceOverバグを回避するための、オプションのフォーカス、フィルタリング、および選択のためのカスタムローカライズされたアナウンス(ARIAライブリージョンを使用)
  • ARIAを介して入力にリンクされた説明とエラーメッセージのヘルプテキストのサポート

API

オートコンプリートのプロパティ

属性説明デフォルト
children*ReactNode[]レンダリングする子要素。通常は、AutocompleteItem および AutocompleteSection 要素のリストです。-
labelReactNodeラベルとして表示するコンテンツ。-
namestringHTMLフォームを送信するときに使用される、入力要素の名前。MDNを参照してください。-
variantflat | bordered | faded | underlinedオートコンプリートのバリアント。flat
colordefault | primary | secondary | success | warning | dangerオートコンプリートの色。default
sizesm | md | lgオートコンプリートのサイズ。md
radiusnone | sm | md | lg | fullオートコンプリートの半径。-
itemsIterable<T>オートコンプリートのアイテムのリスト。(制御された状態)-
defaultItemsIterable<T>オートコンプリートのアイテムのリスト(非制御)。-
inputValuestringオートコンプリートの入力値(制御された状態)。-
defaultInputValuestringオートコンプリートの入力値(非制御)。-
allowsCustomValuebooleanオートコンプリートが、アイテムに一致しない入力値を設定できるかどうか。false
allowsEmptyCollectionbooleanコレクションが空のときに、オートコンプリートのメニューを開くことを許可するかどうか。true
shouldCloseOnBlurboolean入力がフォーカスを失ったときに、オートコンプリートを閉じるかどうか。true
placeholderstringテキスト入力が空の場合に表示される一時的なテキスト。-
descriptionReactNodeフィールドの説明。選択する内容に関する具体的な要件などのヒントを提供します。-
menuTriggerfocus | input | manualメニューを開く原因となるアクション。focus
labelPlacementinside | outside | outside-leftラベルの位置。inside
selectedKeyReact.Keyコレクション内で現在選択されているキー(制御された状態)。-
defaultSelectedKeyReact.Keyコレクション内で最初に選択されたキー(非制御)。-
disabledKeysall | React.Key[]無効になっているアイテムのキー。これらのアイテムは選択、フォーカス、またはその他の操作を行うことができません。-
errorMessageReactNode | ((v: ValidationResult) => ReactNode)フィールドの下に表示するエラーメッセージ。-
validate(value: { inputValue: string, selectedKey: React.Key }) => ValidationError | true | null | undefinedコミット時(例:フォーカスが外れたとき)に入力値を検証し、無効な値のエラーメッセージを返します。-
validationBehaviornative | aria値が不足しているか無効な場合にフォームの送信を防止するために、ネイティブのHTMLフォーム検証を使用するか、ARIAを介してフィールドを必須または無効としてマークするかどうか。aria
startContentReactNodeオートコンプリートの左側にレンダリングされる要素。-
endContentReactNodeオートコンプリートの右側にレンダリングされる要素。-
autoFocusbooleanオートコンプリートがレンダリング時にフォーカスされるかどうか。false
defaultFilter(textValue: string, inputValue: string) => booleanオートコンプリートリストにオプションを含めるかどうかを決定するために使用されるフィルター関数。-
filterOptionsIntl.CollatorOptionsフィルタリングに使用される照合器を作成するために使用されるオプション。{ sensitivity: 'base'}
isReadOnlybooleanオートコンプリートが読み取り専用かどうか。false
isRequiredbooleanオートコンプリートが必須かどうか。false
isInvalidbooleanオートコンプリートが無効かどうか。false
isDisabledbooleanオートコンプリートが無効かどうか。false
fullWidthboolean入力が親の幅を占めるかどうか。true
selectorIconReactNodeオートコンプリートのオープン状態を表すアイコン。通常はシェブロンアイコン。-
clearIconReactNodeクリアボタンで使用されるアイコン。通常はクロスアイコン。-
showScrollIndicatorsbooleanリストボックスがスクロール可能な場合に、スクロールインジケーターを表示するかどうか。true
scrollRefReact.RefObject<HTMLElement>スクロール可能な要素への参照。-
inputPropsInputPropsInputコンポーネントに渡すプロパティ。-
popoverPropsPopoverPropsPopoverコンポーネントに渡すプロパティ。-
listboxPropsListboxPropsListboxコンポーネントに渡すプロパティ。-
scrollShadowPropsScrollShadowPropsScrollShadowコンポーネントに渡すプロパティ。-
selectorButtonPropsButtonPropsセレクターボタンに渡すプロパティ。-
clearButtonPropsButtonPropsクリアボタンに渡すプロパティ。-
isClearablebooleanクリアボタンを表示するかどうか。true
disableClearablebooleanクリアボタンを非表示にするかどうか。(非推奨)代わりにisClearableを使用してください。false
disableAnimationbooleanオートコンプリートをアニメーション化するかどうか。true
disableSelectorIconRotationboolean選択でセレクターアイコンの回転を無効にするかどうか。false
classNamesRecord<"base"| "listboxWrapper"| "listbox"| "popoverContent" | "endContentWrapper"| "clearButton" | "selectorButton", string>オートコンプリートのスロットにカスタムクラス名を設定できるようにします。-

オートコンプリートイベント

属性説明
onOpenChange(isOpen: boolean, menuTrigger?: MenuTriggerAction) => voidメニューのオープン状態が変化したときに呼び出されるメソッド。新しいオープン状態と、メニューのオープンを引き起こしたアクションを返します。
onInputChange(value: string) => voidオートコンプリートの入力値が変化したときに呼び出されるハンドラー。
onSelectionChange(key: React.Key) => voidオートコンプリートの選択が変化したときに呼び出されるハンドラー。
onFocus(e: FocusEvent<HTMLInputElement>) => voidオートコンプリートの入力にフォーカスが当たったときに呼び出されるハンドラー。
onBlur(e: FocusEvent<HTMLInputElement>) => voidオートコンプリートの入力がフォーカスを失ったときに呼び出されるハンドラー。
onFocusChange(isFocused: boolean) => voidオートコンプリートの入力フォーカスが変化したときに呼び出されるハンドラー。
onKeyDown(e: KeyboardEvent) => voidキーが押されたときに呼び出されるハンドラー。
onKeyUp(e: KeyboardEvent) => voidキーが離されたときに呼び出されるハンドラー。
onClose() => voidオートコンプリートのPopoverが閉じられたときに呼び出されるハンドラー。

AutocompleteItem Props

ListboxItemのプロパティを確認してください。

AutocompleteItem Events

ListboxItemのイベントを確認してください。

AutocompleteSection Props

ListboxSectionのプロパティを確認してください。


種類

type MenuTriggerAction = "focus" | "input" | "manual";