Il componente browser integrato <select> ti permette di renderizzare una casella select con opzioni.
<select>
<option value="someOption">Some option</option>
<option value="otherOption">Other option</option>
</select>- Reference
- Usage
- Visualizzare una casella di selezione con opzioni
- Fornire un’etichetta per una casella di selezione
- Fornire un’opzione inizialmente selezionata
- Abilitare la selezione multipla
- Leggere il valore della casella di selezione all’invio di un form
- Controllare una casella di selezione con una variabile di state
Reference
<select>
Per visualizzare una casella select, renderizza il componente browser integrato <select>.
<select>
<option value="someOption">Some option</option>
<option value="otherOption">Other option</option>
</select>Props
<select> supporta tutte le props comuni degli elementi.
Puoi controllare una casella select passando una prop value:
value: Una stringa (o un array di stringhe permultiple={true}). Controlla quale opzione è selezionata. Ogni stringa del valore deve corrispondere alvaluedi un<option>annidato dentro il<select>.
Quando passi value, devi anche passare un gestore di eventi onChange che aggiorni il valore passato.
Se il tuo <select> è non controllato, puoi passare invece la prop defaultValue:
defaultValue: Una stringa (o un array di stringhe permultiple={true}). Specifica l’opzione inizialmente selezionata.
Queste props di <select> sono rilevanti sia per caselle select non controllate che controllate:
autoComplete: Una stringa. Specifica uno dei possibili comportamenti di autocomplete.autoFocus: Un booleano. Setrue, React metterà a fuoco l’elemento al montaggio.children:<select>accetta come children i componenti<option>,<optgroup>e<datalist>. Puoi anche passare i tuoi componenti, purché alla fine renderizzino uno dei componenti consentiti. Se passi i tuoi componenti che alla fine renderizzano tag<option>, ogni<option>che renderizzi deve avere unvalue.disabled: Un booleano. Setrue, la casella select non sarà interattiva e apparirà attenuata.form: Una stringa. Specifica l’iddel<form>a cui appartiene questa casella select. Se omesso, è il form padre più vicino.multiple: Un booleano. Setrue, il browser consente la selezione multipla.name: Una stringa. Specifica il nome di questa casella select che viene inviato con il form.onChange: Una funzione gestore diEvent. Obbligatorio per caselle select controllate. Scatta immediatamente quando l’utente sceglie un’opzione diversa. Si comporta come l’eventoinputdel browser.onChangeCapture: Una versione dionChangeche scatta nella fase di capture.onInput: Una funzione gestore diEvent. Scatta immediatamente quando il valore viene modificato dall’utente. Per ragioni storiche, in React è idiomatico usareonChangeal suo posto, che funziona in modo simile.onInputCapture: Una versione dionInputche scatta nella fase di capture.onInvalid: Una funzione gestore diEvent. Scatta se un input non supera la validazione all’invio del form. A differenza dell’eventoinvalidintegrato, l’evento ReactonInvalidfa bubbling.onInvalidCapture: Una versione dionInvalidche scatta nella fase di capture.required: Un booleano. Setrue, il valore deve essere fornito affinché il form possa essere inviato.size: Un numero. Per select conmultiple={true}, specifica il numero preferito di elementi inizialmente visibili.
Caveats
- A differenza dell’HTML, passare un attributo
selecteda<option>non è supportato. Usa invece<select defaultValue>per caselle select non controllate e<select value>per caselle select controllate. - Se una casella select riceve una prop
value, verrà trattata come controllata. - Una casella select non può essere contemporaneamente controllata e non controllata.
- Una casella select non può passare da controllata a non controllata (o viceversa) nel corso della sua vita.
- Ogni casella select controllata necessita di un gestore di eventi
onChangeche aggiorni in modo sincrono il valore sottostante.
Usage
Visualizzare una casella di selezione con opzioni
Renderizza un <select> con un elenco di componenti <option> al suo interno per visualizzare una casella select. Assegna a ogni <option> un value che rappresenta i dati da inviare con il form.
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> ); }
Fornire un’etichetta per una casella di selezione
Di solito, posizionerai ogni <select> dentro un tag <label>. Questo indica al browser che questa etichetta è associata a quella casella select. Quando l’utente clicca sull’etichetta, il browser metterà automaticamente a fuoco la casella select. È anche essenziale per l’accessibilità: uno screen reader annuncerà la didascalia dell’etichetta quando l’utente mette a fuoco la casella select.
Se non puoi annidare <select> dentro un <label>, associali passando lo stesso ID a <select id> e <label htmlFor>. Per evitare conflitti tra più istanze dello stesso componente, genera un ID del genere con 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> </> ); }
Fornire un’opzione inizialmente selezionata
Per impostazione predefinita, il browser selezionerà il primo <option> nell’elenco. Per selezionare un’opzione diversa di default, passa il value di quell’<option> come defaultValue all’elemento <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> ); }
Abilitare la selezione multipla
Passa multiple={true} al <select> per consentire all’utente di selezionare più opzioni. In quel caso, se specifichi anche defaultValue per scegliere le opzioni inizialmente selezionate, deve essere un array.
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> ); }
Leggere il valore della casella di selezione all’invio di un form
Aggiungi un <form> intorno alla tua casella select con un <button type="submit"> al suo interno. Invocherà il tuo gestore di eventi <form onSubmit>. Per impostazione predefinita, il browser invierà i dati del form all’URL corrente e ricaricherà la pagina. Puoi sovrascrivere questo comportamento chiamando e.preventDefault(). Leggi i dati del form con new FormData(e.target).
export default function EditPost() { function handleSubmit(e) { // Impedisci al browser di ricaricare la pagina e.preventDefault(); // Leggi i dati del form const form = e.target; const formData = new FormData(form); // Puoi passare formData come body di fetch direttamente: fetch('/some-api', { method: form.method, body: formData }); // Puoi generare un URL da esso, come fa il browser di default: console.log(new URLSearchParams(formData).toString()); // Puoi lavorarci come con un oggetto semplice. const formJson = Object.fromEntries(formData.entries()); console.log(formJson); // (!) Questo non include i valori di select multipli // Oppure puoi ottenere un array di coppie nome-valore. 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> ); }
Controllare una casella di selezione con una variabile di state
Una casella select come <select /> è non controllata. Anche se passi un valore inizialmente selezionato come <select defaultValue="orange" />, il tuo JSX specifica solo il valore iniziale, non il valore attuale.
Per renderizzare una casella select controllata, passa la prop value. React forzerà la casella select ad avere sempre il value che hai passato. Di solito, controllerai una casella select dichiarando una variabile di state:
function FruitPicker() {
const [selectedFruit, setSelectedFruit] = useState('orange'); // Dichiara una variabile di state...
// ...
return (
<select
value={selectedFruit} // ...forza il valore del select a corrispondere alla variabile di state...
onChange={e => setSelectedFruit(e.target.value)} // ... e aggiorna la variabile di state a ogni modifica!
>
<option value="apple">Apple</option>
<option value="banana">Banana</option>
<option value="orange">Orange</option>
</select>
);
}Questo è utile se vuoi ri-renderizzare una parte dell’UI in risposta a ogni selezione.
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> </> ); }