Lista wyboru

To prawdziwy <select> z własną listą rozwijaną przeglądarki — co oznacza, że działa bez JavaScriptu, otwiera się poprawnie na telefonie i da się go obsłużyć klawiaturą bez niczego z tej biblioteki.

select() to goła kontrolka; selectField() opakowuje ją w etykietę, tekst pomocy i komunikat błędu, tak samo jak robi to textField().

Podstawowa lista

Opcje mogą być zwykłymi ciągami znaków — wtedy wartość i etykieta są takie same.

selectField({
  label: 'Motyw',
  name: 'theme',
  options: ['Jasny', 'Ciemny', 'Systemowy'],
})

Wartości i etykiety

Podaj obiekty, gdy wysyłana wartość różni się od tekstu, który czyta człowiek. value oznacza wybraną opcję.

selectField({
  label: 'Wyjście',
  name: 'output',
  value: 'dist',
  options: [
    { value: 'dist', label: 'dist/ — domyślne' },
    { value: 'build', label: 'build/' },
    { value: 'public', label: 'public/', disabled: true },
  ],
})

Tekst zastępczy

Tekst zastępczy renderuje się jako wyłączona pierwsza opcja, zaznaczona, gdy nie ma value — więc pole startuje puste, nie będąc przy tym poprawnym wyborem.

selectField({
  label: 'Cel wdrożenia',
  name: 'target',
  placeholder: 'Wybierz hosting…',
  options: ['Netlify', 'Vercel', 'Cloudflare Pages', 'GitHub Pages'],
})

Grupy

Wpis z własną tablicą options staje się elementem <optgroup>.

selectField({
  label: 'Rozszerzenie strony',
  name: 'ext',
  value: '.ht.js',
  options: [
    { label: 'JavaScript', options: ['.ht.js', '.html.js'] },
    { label: 'TypeScript', options: ['.ht.ts', '.html.ts'] },
    { label: 'JSX', options: ['.ht.jsx', '.ht.tsx'] },
  ],
})

Rozmiary

stack({ gap: 'md' },
  selectField({ label: 'Mały', name: 'sm', size: 'sm', options: ['Jeden', 'Dwa'] }),
  selectField({ label: 'Średni', name: 'md', size: 'md', options: ['Jeden', 'Dwa'] }),
  selectField({ label: 'Duży', name: 'lg', size: 'lg', options: ['Jeden', 'Dwa'] }),
)

Pomoc, błąd i wyłączenie

Używany w atrybucie lang elementu html.
Wybierz framework, żeby przejść dalej.
stack({ gap: 'lg' },
  selectField({
    label: 'Język',
    name: 'locale',
    options: ['pl', 'es', 'fr'],
    help: 'Używany w atrybucie lang elementu html.',
  }),
  selectField({
    label: 'Framework',
    name: 'framework',
    placeholder: 'Wybierz jeden…',
    options: ['sitelo'],
    error: 'Wybierz framework, żeby przejść dalej.',
  }),
  selectField({
    label: 'Plan',
    name: 'plan',
    options: ['Darmowy'],
    disabled: true,
  }),
)

Z danych

Opcje to po prostu tablica, więc zwykle pochodzą z tego, co data() już wczytało dla strony.

return (() => {
  const posts = [
    { slug: 'hello-world', title: 'Witaj świecie' },
    { slug: 'static-first', title: 'Najpierw statyczne' },
    { slug: 'no-runtime', title: 'Bez runtime’u' },
  ]

  return selectField({
    label: 'Wyróżniony wpis',
    name: 'featured',
    value: 'static-first',
    options: posts.map((post) => ({ value: post.slug, label: post.title })),
  })
})()

Propsy

PropTypDomyślnieOpis
optionsSelectOption[][]Ciągi znaków, obiekty { value, label, disabled } albo { label, options } dla grupy.
valuestring | number—Która opcja jest wybrana.
placeholderstring—Wyłączona pierwsza opcja, zaznaczona, gdy nie ma wartości.
size'sm' | 'md' | 'lg''md'Wysokość kontrolki i rozmiar tekstu.
namestring—Nazwa pola formularza; z niej wyprowadzany jest id.
invalidbooleanfalseUstawia aria-invalid. selectField ustawia to za Ciebie na podstawie error.
disabledbooleanfalseWyłącza kontrolkę.

selectField() przyjmuje dodatkowo label, help, error, required i fieldClass — zobacz textField(). Dzieci dołączane są po wygenerowanych opcjach, więc możesz dopisać ręcznie te, których potrzebujesz.