ドロップダウン
ユーザーが選択できるアクションやオプションのリストを表示します。
インストール
npx nextui-cli@latest add dropdown
上記のコマンドは、個別のインストールのみを対象としています。もし、 @nextui-org/react がグローバルにインストールされている場合は、このステップをスキップできます。
インポート
NextUI は、ドロップダウン関連の 5 つのコンポーネントをエクスポートします。
- Dropdown: メインのコンポーネントで、他のコンポーネントのラッパーです。このコンポーネントは、Popover コンポーネントの拡張であり、Popover コンポーネントのすべての props を受け入れます。
- DropdownTrigger: ドロップダウンメニューを開くトリガーとなるコンポーネントです。
- DropdownMenu: ドロップダウンアイテムを含むコンポーネントです。
- DropdownSection: ドロップダウンアイテムのグループを含むコンポーネントです。
- DropdownItem: ドロップダウンアイテムを表すコンポーネントです。
使用方法
動的なアイテム
ドロップダウンは、Collection Components APIに従い、静的コレクションと動的コレクションの両方を受け入れます。
- 静的: 上記の使用例は静的な実装を示しており、オプションの完全なリストが事前にわかっている場合に使用できます。
- 動的: 次の例は、オプションが API 呼び出しなどの外部データソースから取得される場合や、時間の経過とともに更新される場合に使用できます。
無効なキー
ドロップダウンアイテムは、disabledKeys prop を DropdownMenu コンポーネントに渡すことで無効にできます。
注: 各アイテムに一意のキーを設定することが重要です。そうしないと、無効なキーが機能しません。
アクションイベント
onAction prop を使用すると、選択したアイテムのキーを取得できます。
バリアント
DropdownMenu コンポーネントの variant を使用すると、ドロップダウンアイテムの hover スタイルを変更できます。
単一選択
ユーザーが一度に1つのアイテムのみを選択できるようにするには、selectionMode プロパティを single に設定します。
複数選択
ユーザーが一度に複数のアイテムを選択できるようにするには、selectionMode プロパティを multiple に設定します。
注意: 空の選択を許可するには、
disallowEmptySelectionプロパティをfalseに設定します。
ショートカット付き
ドロップダウン項目にショートカットを追加するには、shortcut プロパティを使用できます。
注意: ドロップダウンはショートカットイベントを処理しません。自分で処理する必要があります。
アイコン付き
startContent / endContent プロパティを使用して、ドロップダウン項目にアイコンを追加できます。
注意: アイコンの色として
currentColorを使用すると、アイコンは項目テキストと同じ色になります。
説明付き
ドロップダウン項目に説明を追加するには、description プロパティを使用できます。
セクション付き
ドロップダウン項目をグループ化するには、DropdownSection コンポーネントを使用できます。
注意:
titleのないセクションは、アクセシビリティのためにaria-labelを提供する必要があります。
カスタムトリガー
ドロップダウンメニューのトリガーとして任意のコンポーネントを使用できます。それらを DropdownTrigger コンポーネントでラップするだけです。
背景の変更
前述したように、Dropdown コンポーネントは Popover コンポーネントの拡張であるため、backdrop プロパティを含む、Popover コンポーネントのすべてのプロパティを受け入れます。
ルーティング
<DropdownItem> コンポーネントは、Next.js や React Router のようなフレームワークやクライアントサイドルーターで動作します。設定方法については、ルーティングガイドを参照してください。
import {Dropdown, DropdownMenu, DropdownTrigger, DropdownItem, Button} from "@nextui-org/react";function App() {return (<Dropdown><DropdownTrigger><Button variant="bordered">Open Menu</Button></DropdownTrigger><DropdownMenu aria-label="Link Actions"><DropdownItem key="home" href="/home">Home</DropdownItem><DropdownItem key="about" href="/about">About</DropdownItem></DropdownMenu></Dropdown>);}
スロット
ドロップダウンには、DropdownMenu, DropdownItem, DropdownSection の3つのコンポーネントにスロットがあります。
DropdownMenu
- base: メニューコンポーネントのメインラッパー。
topContent、bottomContent、およびlistスロットをラップします。 - list: メニューリストコンポーネントのスロット。このスロットは
ulスロットと見なすことができます。 - emptyContent: コレクションが空の場合に表示するスロットコンテンツ。
DropdownItem
- base: ドロップダウンアイテムのメインスロット。他のすべてのスロットをラップします。
- wrapper:
titleおよびdescriptionのラッパー。 - title: ドロップダウンアイテムのタイトル。
- description: ドロップダウンアイテムの説明。
- shortcut: ショートカットスロット。
- selectedIcon: 選択されたアイコンスロット。アイテムが選択されている場合にのみ表示されます。
DropdownSection
- base: ドロップダウンセクションのメインスロット。他のすべてのスロットをラップします。
- heading: セクショングループの上にレンダリングされるタイトル。
- group: ドロップダウンアイテムのグループ。
- divider: グループ間にレンダリングされる区切り線。これは、
showDividerがtrueの場合にのみ表示されます。
ドロップダウンポップオーバーのカスタマイズ
Dropdown コンポーネントは、Popover コンポーネントの拡張であるため、同じスロットを使用してドロップダウンをカスタマイズできます。
ドロップダウンアイテムのスタイルのカスタマイズ
DropdownMenu の itemClasses プロパティを使用するか、DropdownItem スロットを使用するかで、ドロップダウンアイテムをカスタマイズできます。itemClasses を使用すると、すべてのアイテムを一度にカスタマイズできますが、スロットを使用すると、各アイテムを個別にカスタマイズできます。
キーボード操作
| キー | 説明 |
|---|---|
| Space | フォーカスが DropdownTrigger にある場合、ドロップダウンメニューを開き、最初のアイテムにフォーカスします。フォーカスがアイテムにある場合、フォーカスされたアイテムをアクティブにします。 |
| Enter | フォーカスが DropdownTrigger にある場合、ドロップダウンメニューを開き、最初のアイテムにフォーカスします。フォーカスがアイテムにある場合、フォーカスされたアイテムをアクティブにします。 |
| ArrowDown | フォーカスが DropdownTrigger にある場合、ドロップダウンメニューを開きます。フォーカスがアイテムにある場合、フォーカスを次のアイテムに移動します。 |
| ArrowUp | フォーカスがアイテムにある場合、フォーカスを前のアイテムに移動します。 |
| Esc | ドロップダウンメニューを閉じ、フォーカスを DropdownTrigger に移動します。 |
| A-Z または a-z | メニューが開いている場合、入力された文字で始まるラベルを持つ次のメニューアイテムが存在する場合は、そのメニューアイテムにフォーカスを移動します。 |
データ属性
DropdownItem の base 要素には、次の属性があります。
- data-disabled: ドロップダウンアイテムが無効になっている場合。ドロップダウンの
disabledKeysプロパティに基づきます。 - data-selected: ドロップダウンアイテムが選択されている場合。ドロップダウンの
selectedKeysプロパティに基づきます。 - data-hover: ドロップダウンアイテムがホバーされている場合。useHoverに基づきます。
- data-pressed: ドロップダウンアイテムが押されている場合。usePressに基づきます。
- data-focus: ドロップダウンアイテムがフォーカスされている場合。useFocusRingに基づきます。
- data-focus-visible: ドロップダウン項目がキーボードでフォーカスされている場合。 useFocusRing に基づきます。
アクセシビリティ
- 支援技術に対して、ARIA を使用した
buttonとmenuとして公開されます。 - 単一、複数、または選択なしのサポート。
- 無効化された項目のサポート。
- セクションのサポート。
- アクセシビリティのための複雑な項目ラベルのサポート。
- 矢印キー、Home/End、Page Up/Down を含むキーボードナビゲーションのサポート。詳細については、キーボード操作を参照してください。
- キーボードナビゲーション中の自動スクロールのサポート。
- 矢印キーを使用してメニューを開くためのキーボードサポート(最初の項目または最後の項目に自動的にフォーカスを含む)。
- テキストを入力して項目にフォーカスできるようにするタイプアヘッド。
- 長いリストでのパフォーマンスのための仮想化スクロールのサポート。
API
ドロップダウンのプロパティ
| 属性 | 型 | 説明 | デフォルト |
|---|---|---|---|
| children* | ReactNode[] | レンダリングする子要素。通常は DropdownTrigger 要素と DropdownMenu 要素です。 | - |
| type | menu | listbox | ドロップダウントリガーによって開かれるオーバーレイのタイプ。 | menu |
| trigger | press | longPress | ドロップダウンメニューがトリガーされる方法。 | press |
| isDisabled | boolean | ドロップダウントリガーが無効かどうか。 | false |
| closeOnSelect | boolean | 項目が選択されたときにドロップダウンメニューを閉じるかどうか。 | true |
| shouldBlockScroll | boolean | ドロップダウンメニューがメニュー外のスクロールをブロックする必要があるかどうか。 | true |
| PopoverProps | PopoverProps | ドロップダウンはポップオーバーの拡張であるため、ポップオーバーコンポーネントのすべてのプロパティを受け入れます。 | - |
ドロップダウンイベント
| 属性 | 型 | 説明 |
|---|---|---|
| onOpenChange | (isOpen: boolean) => void | ドロップダウンのオープン状態が変更されたときに呼び出されるハンドラー。 |
| shouldCloseOnInteractOutside | (e: HTMLElement) => void | ユーザーがドロップダウン ref の外部の引数要素とやり取りするときに、onClose を呼び出す必要がある場合は true を返します。 |
| onClose | () => void | ドロップダウンを閉じる必要があるときに呼び出されるハンドラー。 |
DropdownTrigger のプロパティ
| 属性 | 型 | 説明 | デフォルト |
|---|---|---|---|
| children | ReactNode | ドロップダウントリガーコンポーネント。渡された children がフォーカス可能であることを確認してください。ユーザーはキーボードを使用してタブで移動でき、ref を受け取ることができます。これはアクセシビリティにとって重要です。 | - |
DropdownMenu のプロパティ
| 属性 | 型 | 説明 | |
|---|---|---|---|
| children* | ReactNode | ((item: T) => ReactElement) | コレクションの内容。通常は DropdownItem または DropdownSection です。(静的) | - |
| items | Iterable<T> | コレクション内の項目オブジェクト。(動的) | - |
| variant | solid | bordered | light | flat | faded | shadow | ドロップダウン項目の外観スタイル。 | solid |
| color | default | primary | secondary | success | warning | danger | ドロップダウン項目のカラーテーマ。 | default |
| selectionMode | none | single | multiple | コレクションで許可される選択のタイプ。 | - |
| selectedKeys | React.Key[] | コレクション内で現在選択されているキー(制御あり)。 | - |
| disabledKeys | React.Key[] | 無効になっているアイテムのキー。これらのアイテムは選択、フォーカス、またはその他の操作を行うことができません。 | - |
| defaultSelectedKeys | all | React.Key[] | コレクション内で最初に選択されているキー(制御なし)。 | - |
| disallowEmptySelection | boolean | コレクションで空の選択を許可するかどうか。 | false |
| autoFocus | boolean | first | last | フォーカスを設定する場所。 | false |
| topContent | ReactNode | リストボックスアイテムの上に表示するコンテンツ。 | - |
| bottomContent | ReactNode | リストボックスアイテムの下に表示するコンテンツ。 | - |
| emptyContent | ReactNode | コレクションが空の場合に表示するコンテンツ。 | アイテムはありません。 |
| hideEmptyContent | boolean | コレクションが空の場合に空のコンテンツを表示しないかどうか。 | false |
| hideSelectedIcon | boolean | アイテムが選択されているときにチェックアイコンを非表示にするかどうか。 | false |
| shouldFocusWrap | boolean | キーボードナビゲーションが循環するかどうか。 | false |
| closeOnSelect | boolean | 項目が選択されたときにドロップダウンメニューを閉じるかどうか。 | true |
| disableAnimation | boolean | ドロップダウンアイテムのアニメーションを無効にするかどうか。 | false |
| classNames | Record<"base"| "list"| "emptyContent", string> | ドロップダウンメニューのスロットにカスタムクラス名をを設定できます。 | - |
| itemClasses | Record<"base"| "wrapper"| "title"| "description"| "shortcut" | "selectedIcon", string> | ドロップダウンアイテムのスロットにカスタムクラス名をを設定できます。 | - |
DropdownMenu Events
| 属性 | 型 | 説明 |
|---|---|---|
| onAction | (key: React.Key) => void | アイテムが選択されたときに呼び出されるハンドラー。 |
| onSelectionChange | (keys: React.Key[]) => void | 選択が変更されたときに呼び出されるハンドラー。 |
| onClose | () => void | アイテムを選択した後、メニューを閉じる必要がある場合に呼び出されるハンドラー。 |
DropdownSection Props
| 属性 | 型 | 説明 | デフォルト |
|---|---|---|---|
| children* | ReactNode | ドロップダウンセクションの内容。通常、DropdownItem コンポーネントのリスト。(静的) | - |
| title | string | ドロップダウンセクションのタイトル。 | - |
| items | Iterable<T> | コレクション内の項目オブジェクト。(動的) | - |
| hideSelectedIcon | boolean | アイテムが選択されているときにチェックアイコンを非表示にするかどうか。 | false |
| showDivider | boolean | グループ間に区切り線を表示するかどうか。 | false |
| dividerProps | DividerProps | 区切り線コンポーネントのプロパティ。 | - |
| classNames | Record<"base"| "heading"| "group"| "divider", string> | ドロップダウンセクションのスロットにカスタムクラス名をを設定できます。 | - |
| itemClasses | Record<"base"| "wrapper"| "title"| "description"| "shortcut" | "selectedIcon", string> | ドロップダウンアイテムのスロットにカスタムクラス名をを設定できます。 | - |
DropdownItem Props
| 属性 | 型 | 説明 | デフォルト |
|---|---|---|---|
| children* | ReactNode | ドロップダウンアイテムの内容。 | - |
| key | React.Key | ドロップダウンアイテムの一意のキー。 | - |
| title | string | ReactNode | ドロップダウンアイテムのタイトル。 | - |
| textValue | string | アイテムの内容の文字列表現。タイプアヘッドなどの機能に使用されます。 | - |
| description | string | ReactNode | ドロップダウンアイテムの説明。 | - |
| shortcut | string | ReactNode | ドロップダウンアイテムのキーボードショートカット。 | - |
| startContent | ReactNode | ドロップダウンアイテムの開始コンテンツ。 | - |
| endContent | ReactNode | ドロップダウンアイテムの終了コンテンツ。これは、ショートカットと選択されたアイコンの後に配置されます。 | - |
| selectedIcon | SelectedIconProps | アイテムが選択されたときにレンダリングするカスタムアイコン。 | - |
| showDivider | boolean | アイテムの下に区切り線を表示するかどうか。 | false |
| href | string | リンク先のURL。MDNを参照してください。 | - |
| target | HTMLAttributeAnchorTarget | リンクのターゲットウィンドウ。MDNを参照してください。 | - |
| rel | string | リンクされたリソースと現在のページの関係。MDNを参照してください。 | - |
| download | boolean | string | ブラウザーにリンクされたURLをダウンロードさせます。ファイル名を提案するために文字列を指定できます。MDNを参照してください。 | - |
| ping | string | リンクをたどるときにpingするURLをスペースで区切ったリスト。MDNを参照してください。 | - |
| referrerPolicy | HTMLAttributeReferrerPolicy | リンクをたどるときに送信するリファラーの量。MDNを参照してください。 | - |
| isDisabled | boolean | ドロップダウンアイテムを無効にするかどうか。(非推奨)代わりにDropdownMenuにdisabledKeysを渡してください。 | false |
| isSelected | boolean | ドロップダウンアイテムを選択する必要があるかどうか。(非推奨)代わりにDropdownMenuにselectedKeysを渡してください。 | false |
| isReadOnly | boolean | ドロップダウンアイテムのプレスイベントを無視するかどうか。 | false |
| hideSelectedIcon | boolean | アイテムが選択されたときにチェックアイコンを非表示にするかどうか。 | false |
| closeOnSelect | boolean | アイテムが選択されたときにドロップダウンメニューを閉じる必要があるかどうか。 | true |
| classNames | Record<"base"| "wrapper"| "title"| "description"| "shortcut" | "selectedIcon", string> | ドロップダウンアイテムのスロットにカスタムクラス名をを設定できます。 | - |
DropdownItem イベント
| 属性 | 型 | 説明 |
|---|---|---|
| onAction | () => void | ドロップダウンアイテムが選択されたときに呼び出されるハンドラー。(非推奨)代わりにDropdownMenuに渡してください。 |
| onClose | () => void | ドロップダウンアイテムを選択後に閉じる必要がある場合に呼び出されるハンドラー。(非推奨)代わりにDropdownMenuに渡してください。 |
| onPress | (e: PressEvent) => void | ターゲット上でプレスがリリースされたときに呼び出されるハンドラー。 |
| onPressStart | (e: PressEvent) => void | プレスインタラクションが開始されたときに呼び出されるハンドラー。 |
| onPressEnd | (e: PressEvent) => void | プレスインタラクションが終了したときに呼び出されるハンドラー。ターゲット上またはポインターがターゲットから離れたとき。 |
| onPressChange | (isPressed: boolean) => void | プレス状態が変化したときに呼び出されるハンドラー。 |
| onPressUp | (e: PressEvent) => void | プレスがターゲット上でリリースされたときに呼び出されるハンドラー。ターゲット上で開始されたかどうかは関係ありません。 |
| onKeyDown | (e: KeyboardEvent) => void | キーが押されたときに呼び出されるハンドラー。 |
| onKeyUp | (e: KeyboardEvent) => void | キーが離されたときに呼び出されるハンドラー。 |
| onClick | MouseEventHandler | ネイティブのボタンクリックイベントハンドラー(非推奨)代わりにonPressを使用してください。 |
型
ドロップダウンアイテム選択済みアイコンのプロパティ
export type DropdownItemSelectedIconProps = {/*** The current icon, usually an checkmark icon.*/icon?: ReactNode;/*** The current selected status.*/isSelected?: boolean;/*** The current disabled status.* @default false*/isDisabled?: boolean;};type selectedIcon?: ReactNode | ((props: DropdownItemSelectedIconProps) => ReactNode) | null;

