セレクトボックス・コンボボックス(Select / Combobox)

クリックで開くメニューや選択UIの実装を5つのアプローチで比較。 単一選択・複数選択・検索フィルタ・グループ化など、実践的なユースケースをインタラクティブに確認できます。

💡 アクションメニュー(クリックでコマンドを実行するドロップダウン)をお探しの場合はドロップダウン(アクションメニュー)ページ →

React Select

フロントエンドで最も広く使われるセレクトライブラリ。単一選択・複数選択・検索フィルタ・グループ化をすべて props で制御できる。カスタムスタイル(styles prop)にも対応。

isClearableisMultiisSearchableグループ化カスタムスタイル
読み込み中...
tsx
'use client';
import { useState } from 'react';
import ReactSelect, { MultiValue, SingleValue } from 'react-select';

type Option = { value: string; label: string };

const languageOptions: Option[] = [
  { value: 'javascript', label: 'JavaScript' },
  { value: 'typescript', label: 'TypeScript' },
  { value: 'python', label: 'Python' },
  { value: 'go', label: 'Go' },
  { value: 'rust', label: 'Rust' },
];

const groupedOptions = [
  {
    label: 'フロントエンド',
    options: [
      { value: 'javascript', label: 'JavaScript' },
      { value: 'typescript', label: 'TypeScript' },
    ],
  },
  {
    label: 'バックエンド',
    options: [
      { value: 'python', label: 'Python' },
      { value: 'go', label: 'Go' },
      { value: 'rust', label: 'Rust' },
    ],
  },
];

export function ReactSelectDemo() {
  const [single, setSingle] = useState<SingleValue<Option>>(null);
  const [multi, setMulti] = useState<MultiValue<Option>>([]);

  return (
    <div className="flex flex-col gap-4 max-w-xs">
      {/* 単一選択(検索・クリアボタン付き) */}
      <ReactSelect
        placeholder="言語を選択..."
        options={languageOptions}
        value={single}
        onChange={setSingle}
        isClearable
        isSearchable
      />

      {/* 複数選択 */}
      <ReactSelect
        placeholder="複数選択可..."
        options={languageOptions}
        value={multi}
        onChange={setMulti}
        isMulti
        isClearable
        closeMenuOnSelect={false}
      />

      {/* グループ化オプション */}
      <ReactSelect
        placeholder="カテゴリから選択..."
        options={groupedOptions}
        isClearable
      />

      {/* 無効状態 */}
      <ReactSelect
        placeholder="選択不可"
        options={languageOptions}
        isDisabled
      />
    </div>
  );
}

🤖 AIプロンプトテンプレート

React + Tailwind CSSで、React Selectを使ったセレクトボックスを実装してください。
- 使用ライブラリ: react-select
- Select コンポーネントで単一選択を実装(isClearable で×ボタン付き、isSearchable で検索対応)
- isMulti prop で複数選択に切り替え(タグ形式で選択済みアイテムを表示)
- closeMenuOnSelect={false} で複数選択時にメニューを閉じないよう設定
- options に { label, options } の配列を渡してグループ化オプションを実装
- isDisabled・isLoading・placeholder・defaultValue など基本propsを活用
- styles prop でカスタムスタイルを適用(Tailwindのカラー変数に合わせてカスタマイズ)

⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。

ライブラリ比較

項目React SelectMantineAnt Designshadcn/uiカスタム
単一選択✅ Select✅ Select✅ Select✅ Select✅ 自作
複数選択✅ isMulti✅ MultiSelect✅ mode="multiple"⚠️ 標準なし✅ 自作MultiSelect
タグ入力モード⚠️ Creatable別途✅ TagsInput別途✅ mode="tags"⚠️ 手動実装⚠️ 手動実装
検索フィルタ✅ isSearchable✅ searchable✅ showSearch⚠️ Comboboxで実装⚠️ query stateで自作
グループ化✅ label+options✅ group+items✅ label+options✅ SelectGroup⚠️ 手動レンダリング
クリアボタン✅ isClearable✅ clearable✅ allowClear⚠️ 手動実装⚠️ 手動実装
バリデーション統合⚠️ RHF等と別途✅ error prop⚠️ Form.Item経由⚠️ RHF等と別途⚠️ 手動実装
アクセシビリティ✅ WAI-ARIA準拠✅ WAI-ARIA準拠✅ WAI-ARIA準拠✅ Base UI標準⚠️ 手動対応が必要
バンドルサイズ⚠️ 約30kB⚠️ 中(全体で大)⚠️ 中(全体で大)✅ 使った分だけ✅ ゼロ追加

選択のポイント

  • React Select — フロントエンドで最も広く使われるセレクトライブラリ。単一・複数・検索・グループ化を props だけで制御でき、styles/classNames で完全なスタイルカスタマイズが可能。 React Select 単体で使いたい場合や既存スタックに依存したくない場合に最適。
  • Mantine — Select は searchable・clearable・グループ化・バリデーションを標準サポート。 MultiSelect は maxValues で上限設定、タグ形式の表示も組み込み済み。 すでに Mantine を採用しているプロジェクトなら最も統一感が出る。
  • Ant Design — mode prop 1つで単一・複数・タグ入力を切り替えられる柔軟さが特徴。 タグモードでユーザーが任意の値を追加できる。管理画面向けのフォームに豊富な実績がある。
  • shadcn/ui — Base UI ベースで軽量かつアクセシビリティが高い。コードが手元にあるため スタイルの完全カスタマイズが可能。Combobox は手動実装が必要だが、デザイン自由度は最高。
  • カスタム実装 — 外部ライブラリを使わずデザインを完全制御したい場合に。ネイティブ <select> の 手軽なスタイリングから、フル機能のカスタムドロップダウンまで段階的に選べる。 学習コストは高いが、デザインシステムへの完全準拠・軽量化が必要な場面では有力な選択肢。

🤖 AIプロンプトテンプレート

以下の要件でReactのセレクトボックスを実装してください。

【使用ライブラリ】React Select / Mantine Select / Ant Design Select / shadcn/ui / カスタム実装
【選択モード】単一選択 / 複数選択
【機能】検索フィルタ: あり / なし、グループ化: あり / なし、クリアボタン: あり / なし
【スタイル】デフォルト / カスタム(Tailwind CSS)
【その他要件】(自由記述)

⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。

関連ページ