<select>
Вбудований компонент браузера <select>
компонента дозволяє відображати поле вибору з опціями.
<select>
<option value="someOption">Some option</option>
<option value="otherOption">Other option</option>
</select>
Довдіник
<select>
Щоб відобразити поле вибору, відрендеріть вбудований компонент браузера <select>
.
<select>
<option value="someOption">Some option</option>
<option value="otherOption">Other option</option>
</select>
Дивіться більше прикладів нижче.
Пропси
<select>
підтримує всі пропси спільних елементів.
Ви можете зробити поле вибору керованим, передавши значення
prop:
значення
: Рядок (або масив рядків дляmultiple={true}
). Визначає, яку опцію буде обрано. Кожен рядок значення відповідаєvalue
деякого<option>
, вкладеного у<select>
.
При передачі значення
ви також повинні передати обробник onChange
, який оновлює передане значення.
Якщо ваш <select>
є неконтрольованим, ви можете передати замість нього проп defaultValue
:
defaultValue
: Рядок (або масив рядків дляmultiple={true}
). Вказує початково вибрану опцію.
Ці <select>
пропси стосуються як неконтрольованих, так і контрольованих полів вибору:
autoComplete
: Рядок. Вказує одну з можливих поведінок автозаповнення.autoFocus
: Булеве значення. Якщоtrue
, React сфокусує елемент на mount. .
children
:<select>
приймає компоненти<option>
,<optgroup>
та<datalist>
як дочірні. Ви також можете передавати власні компоненти, якщо вони зрештою рендеритимуть один із дозволених компонентів. Якщо ви передаєте власні компоненти, які зрештою рендеритимуть теги<option>
, кожен<option>
, який ви рендерите, повинен матизначення
.disabled
: Булевий вираз. Якщоtrue
, поле вибору не буде інтерактивним і виглядатиме затемненим.form
: Рядок. Вказує ідентифікаторid
для<form>
, до якого належить це поле вибору. Якщо не вказано, це найближча батьківська форма.multiple
: Логічний вираз. Якщоtrue
, браузер дозволяє множинний вибір.name
: Рядок. Вказує ім'я для цього поля вибору, яке надсилається разом з формою.onChange
: Функція-обробникEvent
. Потрібна для контрольованих полів вибору. Спрацьовує негайно, коли користувач вибирає іншу опцію. Поводиться подібно до подіїinput
браузера.onChangeCapture
: ВерсіяonChange
, яка спрацьовує у фазі захоплення.onInput
: Функція-обробникEvent
. Спрацьовує негайно, коли користувач змінює значення. З історичних причин у React ідіоматичним є використанняonChange
, який працює аналогічно.onInputCapture
: ВерсіяonInput
, яка спрацьовує у фазі захоплення.onInvalid
: Функція-обробникEvent
. Спрацьовує, якщо вхідні дані не пройшли валідацію при надсиланні форми. На відміну від вбудованої подіїinvalid
, подія ReactonInvalid
bubbles.onInvalidCapture
: ВерсіяonInvalid
, яка спрацьовує у фазі захоплення.required
: Логічний вираз. Якщоtrue
, значення має бути надано для форми для відправки.size
: Число. Дляmultiple={true}
вибирає, вказує бажану кількість початково видимих елементів.
Застереження
- На відміну від HTML, передача атрибута
selected
до<option>
не підтримується. Замість цього використовуйте<select defaultValue>
для некерованих полів вибору і<select value>
для керованих полів вибору. - Якщо поле вибору отримує проп
значення
, його буде розглянуто як керований. - Поле вибору не може бути одночасно контрольованим і неконтрольованим.
- Поле вибору не може перемикатися між контрольованим та неконтрольованим станом протягом свого життя.
- Кожне кероване поле вибору потребує обробник подій
onChange
, який синхронно оновлює його опорне значення.
Використання
Відображення поля вибору з опціями
Зобразіть <select>
зі списком <option>
компонентів всередині для відображення вікна вибору. Надати кожному <option>
значення
, що представляє дані, які буде надіслано з формою.
export default function FruitPicker() {
return (
<label>
Pick a fruit:
<select name="selectedFruit">
<option value="apple">Apple</option>
<option value="banana">Banana</option>
<option value="orange">Orange</option>
</select>
</label>
);
}
select { margin: 5px; }
Надання мітки для поля вибору
Зазвичай, ви розміщуєте кожну <select>
всередині тегу <label>
. Це повідомляє браузеру, що ця мітка пов'язана з цим полем вибору. Коли користувач натискає на мітку, браузер автоматично фокусує поле вибору. Це також важливо для доступності: програма для зчитування з екрана озвучить підпис мітки, коли користувач сфокусує поле вибору.
Якщо ви не можете вкласти <select>
у <label>
, об'єднайте їх, передавши однаковий ідентифікатор <select id>
та <label htmlFor>
. Щоб уникнути конфліктів між екземплярами одного компонента, згенеруйте такий ідентифікатор за допомогою useId
.
import { useId } from 'react';
export default function Form() {
const vegetableSelectId = useId();
return (
<>
<label>
Pick a fruit:
<select name="selectedFruit">
<option value="apple">Apple</option>
<option value="banana">Banana</option>
<option value="orange">Orange</option>
</select>
</label>
<hr />
<label htmlFor={vegetableSelectId}>
Pick a vegetable:
</label>
<select id={vegetableSelectId} name="selectedVegetable">
<option value="cucumber">Cucumber</option>
<option value="corn">Corn</option>
<option value="tomato">Tomato</option>
</select>
</>
);
}
select { margin: 5px; }
Надання початково вибраної опції
За замовчуванням браузер вибере перший <option>
у списку. Щоб вибрати інший варіант за замовчуванням, передайте значення цього
<option>
як defaultValue
елементу <select>
.
export default function FruitPicker() {
return (
<label>
Pick a fruit:
<select name="selectedFruit" defaultValue="orange">
<option value="apple">Apple</option>
<option value="banana">Banana</option>
<option value="orange">Orange</option>
</select>
</label>
);
}
select { margin: 5px; }
На відміну від HTML, передача атрибута selected
окремому <option>
не підтримується.
Увімкнення множинного вибору
Передайте multiple={true}
до <select>
, щоб дозволити користувачеві вибрати декілька варіантів. У такому випадку, якщо ви також вкажете defaultValue
для вибору початково вибраних опцій, це має бути масив.
export default function FruitPicker() {
return (
<label>
Pick some fruits:
<select
name="selectedFruit"
defaultValue={['orange', 'banana']}
multiple={true}
>
<option value="apple">Apple</option>
<option value="banana">Banana</option>
<option value="orange">Orange</option>
</select>
</label>
);
}
select { display: block; margin-top: 10px; width: 200px; }
Зчитування значення поля вибору під час надсилання форми
Додайте <form>
навколо поля вибору з <button type="submit">
всередині. Він викличе ваш обробник події <form onSubmit>
. За замовчуванням браузер надішле дані форми на поточну URL-адресу і оновить сторінку. Ви можете змінити цю поведінку, викликавши e.preventDefault()
. Прочитайте дані форми за допомогою new FormData(e.target)
.
export default function EditPost() {
function handleSubmit(e) {
// Prevent the browser from reloading the page
e.preventDefault();
// Read the form data
const form = e.target;
const formData = new FormData(form);
// You can pass formData as a fetch body directly:
fetch('/some-api', { method: form.method, body: formData });
// You can generate a URL out of it, as the browser does by default:
console.log(new URLSearchParams(formData).toString());
// You can work with it as a plain object.
const formJson = Object.fromEntries(formData.entries());
console.log(formJson); // (!) This doesn't include multiple select values
// Or you can get an array of name-value pairs.
console.log([...formData.entries()]);
}
return (
<form method="post" onSubmit={handleSubmit}>
<label>
Pick your favorite fruit:
<select name="selectedFruit" defaultValue="orange">
<option value="apple">Apple</option>
<option value="banana">Banana</option>
<option value="orange">Orange</option>
</select>
</label>
<label>
Pick all your favorite vegetables:
<select
name="selectedVegetables"
multiple={true}
defaultValue={['corn', 'tomato']}
>
<option value="cucumber">Cucumber</option>
<option value="corn">Corn</option>
<option value="tomato">Tomato</option>
</select>
</label>
<hr />
<button type="reset">Reset</button>
<button type="submit">Submit</button>
</form>
);
}
label, select { display: block; }
label { margin-bottom: 20px; }
Дайте ім'я
вашому <select>
, наприклад <select name="selectedFruit" />
. Вказане вами name
буде використано як ключ у даних форми, наприклад { selectedFruit: "orange" }
.
Якщо ви використовуєте <select multiple={true}>
, то FormData
, який ви отримаєте з форми, міститиме кожне вибране значення як окрему пару ім'я-значення. Уважно подивіться на консольні журнали у наведеному вище прикладі.
За замовчуванням, будь-який <button>
всередині <form>
надішле його. Це може бути несподівано! Якщо у вас є власний кастомний Button
React-компонент, розгляньте можливість повернення <button type="button">
замість <button>
. Тоді, для більшої ясності, використовуйте <button type="submit">
для кнопок, які мають надсилати форму.
Керування полем вибору зі змінною стану
Поле вибору на зразок <select />
є неконтрольованим. Навіть якщо ви передасте початково вибране значення як <select defaultValue="orange" />
, ваш JSX вказує лише початкове значення, а не те, що є зараз.
Щоб відрендерити контрольоване поле вибору, передайте йому проп value
. React змусить поле вибору завжди мати передане вами значення value
. Зазвичай, ви керуєте перемикачем, оголошуючи змінну стану :
function FruitPicker() {
const [selectedFruit, setSelectedFruit] = useState('orange'); // Declare a state variable...
// ...
return (
<select
value={selectedFruit} // ...force the select's value to match the state variable...
onChange={e => setSelectedFruit(e.target.value)} // ... and update the state variable on any change!
>
<option value="apple">Apple</option>
<option value="banana">Banana</option>
<option value="orange">Orange</option>
</select>
);
}
Це корисно, якщо ви хочете повторно відрендерити якусь частину інтерфейсу у відповідь на кожен вибір.
import { useState } from 'react';
export default function FruitPicker() {
const [selectedFruit, setSelectedFruit] = useState('orange');
const [selectedVegs, setSelectedVegs] = useState(['corn', 'tomato']);
return (
<>
<label>
Pick a fruit:
<select
value={selectedFruit}
onChange={e => setSelectedFruit(e.target.value)}
>
<option value="apple">Apple</option>
<option value="banana">Banana</option>
<option value="orange">Orange</option>
</select>
</label>
<hr />
<label>
Pick all your favorite vegetables:
<select
multiple={true}
value={selectedVegs}
onChange={e => {
const options = [...e.target.selectedOptions];
const values = options.map(option => option.value);
setSelectedVegs(values);
}}
>
<option value="cucumber">Cucumber</option>
<option value="corn">Corn</option>
<option value="tomato">Tomato</option>
</select>
</label>
<hr />
<p>Your favorite fruit: {selectedFruit}</p>
<p>Your favorite vegetables: {selectedVegs.join(', ')}</p>
</>
);
}
select { margin-bottom: 10px; display: block; }
Якщо ви передасте значення
без onChange
, вибрати варіант буде неможливо. Коли ви керуєте полем вибору, передаючи йому деяке значення
, ви примушуєте його завжди мати значення, яке ви передали. Отже, якщо ви передасте змінну стану як значення
, але забудете синхронно оновити цю змінну стану під час обробника події onChange
, React повертатиме поле вибору після кожного натискання клавіші до значення
, яке ви вказали.
На відміну від HTML, передача атрибута selected
окремому <option>
не підтримується.