MenüChevron Down
Select Auswahlfeld - Docs - Artefact

Select Auswahlfeld

Forms
Automatisch interaktiv

Einführung

Eine Dropdown-Steuerung zum Auswählen einer oder mehrerer Optionen aus einer Liste — eine barrierefreie, gestaltbare Alternative zum nativen <select>-Element.

Wann etwas anderes verwendet werden sollte:

  • Bei weniger als ca. 5 Optionen ist eine RadioGroup meist übersichtlicher.
  • Wenn der Benutzer zum Filtern der Optionen tippen können soll, verwenden Sie Combobox.

Die Komponente rendert ein visuell ausgeblendetes natives <select> neben der benutzerdefinierten Oberfläche, sodass eine name-Eigenschaft sie ohne zusätzlichen Aufwand an der regulären Formularübermittlung beteiligt.

Tastaturinteraktion

Der Auslöser ist eine role="combobox"-Schaltfläche; der Fokus bleibt darauf, während die hervorgehobene Option über aria-activedescendant gemeldet wird.

TasteVerhalten
Enter / SpaceÖffnet die Liste; bei geöffneter Liste wird die hervorgehobene Option ausgewählt.
ArrowDown / ArrowUpÖffnet die Liste oder bewegt die Hervorhebung (zyklisch, überspringt deaktivierte Optionen).
Home / EndHebt die erste / letzte aktivierte Option hervor.
EscapeSchließt die Liste.
TabSchließt die Liste und verschiebt den Fokus.
Druckbare ZeichenTypeahead: springt zur ersten Option, deren Beschriftung dem eingegebenen Präfix entspricht. Wenn die Liste geschlossen ist (Einzelmodus), wird der Treffer direkt ausgewählt, wie bei einem nativen <select>.

Das Öffnen der Liste hebt die aktuell ausgewählte Option (oder die erste aktivierte) hervor, und die Tastaturnavigation hält die hervorgehobene Option im sichtbaren Bereich.

Hydration

Stufe 1 — automatisch interaktiv. Das Öffnen der Dropdown-Liste und das Auswählen einer Option erfordern Client-JS, und es gibt keinen statischen Fallback (das native <select> ist visuell ausgeblendet und dient nur der Formularübermittlung), daher hydratisiert Select standardmäßig. Übergeben Sie interactive={false}, um ein rein statisches Rendering zu erzwingen.

interactive-EigenschaftErgebnis
weggelassenHydratisiert als Insel
trueHydratisiert als Insel
falseStatisch — kein Client-JS

Alle Interaktivitätsentscheidungen in der Bibliothek laufen über den gemeinsamen shouldHydrate()-Helfer in app/components/ui/island-utils.ts.

Verwendung

React
Solid
Svelte
Vue
Hono
import { Select } from "../components/ui";

const items = [
  { label: "React", value: "react" },
  { label: "Solid", value: "solid" },
  { label: "Svelte", value: "svelte", disabled: true },
  { label: "Vue", value: "vue" },
  { label: "Hono", value: "hono" },
];

export default function MyPage() {
  return (
    <Select
      items={items}
      label="Framework"
      placeholder="Select a framework"
      allowClear
    />
  );
}

Mehrfachauswahl

Die Liste bleibt geöffnet, während Optionen umgeschaltet werden, und der Auslöser zeigt die ausgewählten Beschriftungen durch Kommas getrennt an.

<Select
  multiple
  items={items}
  label="Frameworks"
  placeholder="Select frameworks"
  defaultValue={["hono"]}
/>

In einem Formular

Das ausgeblendete native <select> trägt die Auswahl, daher funktioniert ein einfacher Formular-Post:

<form method="post" action="/frameworks">
  <Select name="framework" items={items} label="Framework" required />
  <Button type="submit">Save</Button>
</form>

Größen und Varianten

<Select items={items} size="sm" placeholder="Small" />
<Select items={items} size="lg" variant="surface" placeholder="Large surface" />
<Select items={items} invalid placeholder="Invalid state" />

CMS-Seitenbauer

Diese Komponente ist als select-Block im Seitenbauer (content/pages/*.json) verfügbar:

{
  "type": "select",
  "label": "Framework",
  "placeholder": "Select a framework",
  "items": [
    { "label": "React", "value": "react" },
    { "label": "Hono", "value": "hono" }
  ]
}

Eigenschaften

EigenschaftTypBeschreibung
itemsSelectItem[]Die in der Liste anzuzeigenden Optionen.
labelChildÜber dem Auslöser gerenderte und mit ihm verknüpfte Beschriftung.
placeholderstringText, der im Auslöser angezeigt wird, solange nichts ausgewählt ist.
allowClearbooleanZeigt eine Löschen-Schaltfläche an, sobald eine Auswahl existiert.
multiplebooleanErlaubt die Auswahl mehrerer Optionen; die Liste bleibt beim Umschalten geöffnet.
defaultValuestring[]Anfängliche Auswahl (ungesteuert). Alias von selectedValues.
selectedValuesstring[]Anfängliche Auswahl (identisch mit defaultValue).
deselectablebooleanIm Einzelmodus entfernt erneutes Klicken der ausgewählten Option die Auswahl.
namestringName des ausgeblendeten nativen <select> für die Formularübermittlung.
disabledbooleanDeaktiviert die gesamte Steuerung.
invalidbooleanMarkiert die Steuerung als ungültig (aria-invalid, Fehlerrahmen).
readOnlybooleanDie Auswahl ist sichtbar, aber die Liste kann nicht geöffnet werden.
requiredbooleanMarkiert die Steuerung als erforderlich (aria-required, ausgeblendetes <select> required).
openbooleanGesteuerter Öffnungszustand der Dropdown-Liste.

| size | `"xs" \ | "sm" \ | "md" \ | "lg" \ | "xl"` | Größe des Auslösers und der Liste. Standardmäßig md. |

| variant | `"outline" \ | "surface"` | Visuelle Variante des Auslösers. Standardmäßig outline. |

| interactive | boolean | Überschreibt die Hydratisierungsentscheidung (siehe unten). | | onValueChange | (values: string[]) => void | Wird bei jeder Änderung der Auswahl mit der vollständigen Auswahl aufgerufen (Auswählen, Abwählen, Leeren). | | onItemSelect | (value: string) => void | Wird mit dem Wert der Option aufgerufen, mit der interagiert wurde. | | onClear | () => void | Wird aufgerufen, wenn die Löschen-Schaltfläche die Auswahl leert. | | onOpenChange | (open: boolean) => void | Wird aufgerufen, wenn die Dropdown-Liste geöffnet oder geschlossen wird. |

Callback-Eigenschaften funktionieren nur, wenn das Select aus clientseitigem Code (innerhalb einer anderen Insel) zusammengesetzt wird. Von einer serverseitig gerenderten Route serialisierte Eigenschaften müssen reine Daten sein.

SelectItem

EigenschaftTypBeschreibung
labelstringDer Anzeigetext für die Option. Wird auch für die Typeahead-Suche verwendet.
valuestringDer eindeutige Wert für die Option.
disabledbooleanLegt fest, ob die Option ausgewählt werden kann.