<select>
Selaimen sisäänrakennettu <select>
-komponentti mahdollistaa valintalistan renderöimisen vaihtoehtoineen.
<select>
<option value="someOption">Jokin vaihtoehto</option>
<option value="otherOption">Toinen vaihtoehto</option>
</select>
Viite
<select>
Näyttääksesi valintalistan, renderöi selaimen sisäänrakennettu <select>
-komponentti.
<select>
<option value="someOption">Jokin vaihtoehto</option>
<option value="otherOption">Toinen vaihtoehto</option>
</select>
Propsit
<select>
tukee kaikkia yleisten elementtien propseja.
Voit tehdä valintalistan kontrolloiduksi antamalla value
-propsin:
value
: Merkkijono (tai merkkijonojen taulukkomultiple={true}
). Ohjaa, mikä vaihtoehto on valittuna. Jokainen merkkijonon arvo vastaa jonkin<option>
-komponentinvalue
-arvoa, joka on upotettu<select>
-komponenttiin.
Kun välität value
:n, sinun täytyy myös välittää onChange
-käsittelijäfunktio, joka päivittää välitetyn arvon.
Jos <select>
on kontrolloimaton, voit antaa defaultValue
-propsin:
defaultValue
: Merkkijono (tai merkkijonojen taulukkomultiple={true}
). Määrittelee aluksi valitun vaihtoehdon.
Nämä <select>
-propsit ovat olennaisia sekä kontrolloimattomille että kontrolloiduille valintalistoille:
autoComplete
: Merkkijono. Määrittää yhden mahdollisista automaattisen täydennyksen käyttäytymistavoista.autoFocus
: Totuusarvo. Jostrue
, React kohdistaa elementtiin mountatessa.children
:<select>
hyväksyy<option>
,<optgroup>
, ja<datalist>
komponentit lapsina. Voit myös välittää omia komponentteja kunhan ne lopulta renderöivät jonkun sallituista komponenteista. Jos välität omia komponentteja, jotka lopulta renderöivät<option>
tageja, jokaisen<option>
:n täytyy omatavalue
.disabled
: Totuusarvo. Jostrue
, valintalista ei ole interaktiivinen ja näkyy himmennettynä.form
: Merkkijono. Määrittää<form>
lomakkeenid
:n johon tämä kenttä kuuluu. Jos jätetty pois, se on lähin ylätason lomake.multiple
: Totuusarvo. Jostrue
, selain mahdollistaa monen vaihtoehdon valinnan.name
: Merkkijono. Määrittää nimen tälle kentälle, joka lähetetään lomakkeessa.onChange
:Event
käsittelijäfunktio. Vaaditaan kontrolloituihin valintalistoihin. Suoritetaan heti kun käyttäjä valitsee toisen vaihtoehdon. Käyttäytyy kuten selaimeninput
tapahtuma.onChangeCapture
: VersioonChange
:sta joka suoritetaan nappausvaiheessa.onInput
:Event
käsittelijäfunktio. Suoritetaan heti kun käyttäjä muuttaa kentän arvoa. Historiallisista syistä, Reactissa on idiomaattista käyttää tämän tilallaonChange
, joka toimii samanlaisesti.onInputCapture
: VersioonInput
:sta joka suoritetaan nappausvaiheessa.onInvalid
:Event
käsittelijäfunktio. Suoritetaan jos syöte ei läpäise validointia lomaketta lähetettäessä. Toisin kuin selaimen sisäänrakennettuinvalid
-tapahtuma, ReactinonInvalid
-tapahtuma kuplii.onInvalidCapture
: VersioonInvalid
:sta joka suoritetaan nappausvaiheessa.required
: Totuusarvo. Jostrue
, arvon on oltava lomaketta lähettäessä.size
: Numero.multiple={true}
valintalistoille, määrittelee halutun määrän aluksi näkyvillä olevia kohteita.
Rajoitukset
- Toisin kuin HTML:ssä,
<option>
-komponentinselected
-attribuutti ei ole tuettu. Sen sijaan, käytä<select defaultValue>
kontrolloimattomille valintalistoille ja<select value>
kontrolloiduille valintalistoille. - Jos valintalista vastaanottaa
value
-propsin, se käsitellään kontrolloituna. - Valintalista ei voi olla sekä kontrolloitu että kontrolloimaton samaan aikaan.
- Valintalista ei voi vaihtaa kontrolloidusta kontrolloimattomaan elinkaarensa aikana.
- Jokainen kontrolloitu valintalista tarvitsee
onChange
-käsittelijäfunktion, joka päivittää arvon synkronisesti.
Käyttö
Valintalistan näyttäminen vaihtoehdoilla
Renderöi <select>
-komponentti, jossa on sisällä lista <option>
-komponentteja näyttääksesi valintalistan. Anna jokaiselle <option>
-komponentille value
, joka edustaa dataa, joka lähetetään lomakkeen mukana.
export default function FruitPicker() { return ( <label> Valitse hedelmä: <select name="selectedFruit"> <option value="apple">Omena</option> <option value="banana">Banaani</option> <option value="orange">Orange</option> </select> </label> ); }
Otsikon tarjoaminen valintalistalle
Tyypillisesti, laitat jokaisen <select>
-komponentin <label>
tagin sisälle. Tämä kertoo selaimelle, että tämä otsikko on yhdistetty tähän valintalistaan. Kun käyttäjä klikkaa otsikkoa, selain kohdistaa automaattisesti valintalistan. Tämä on myös olennaista saavutettavuuden kannalta: ruudunlukija ilmoittaa otsikon kuvauksen kun käyttäjä kohdistaa valintalistan.
If you can’t nest <select>
into a <label>
, associate them by passing the same ID to <select id>
and <label htmlFor>
. To avoid conflicts between multiple instances of one component, generate such an ID with useId
.
Jos et voi sijoittaaa <select>
-komponenttia <label>
-komponentin sisään, yhdistä ne antamalla sama ID <select id>
:lle ja <label htmlFor>
. Välttääksesi konflikteja useiden saman komponentin instanssien välillä, generoi tällainen ID useId
-komponentilla.
import { useId } from 'react'; export default function Form() { const vegetableSelectId = useId(); return ( <> <label> Valitse hedelmä: <select name="selectedFruit"> <option value="apple">Omena</option> <option value="banana">Banaani</option> <option value="orange">Appelsiini</option> </select> </label> <hr /> <label htmlFor={vegetableSelectId}> Valitse vihannes: </label> <select id={vegetableSelectId} name="selectedVegetable"> <option value="cucumber">Kurkku</option> <option value="corn">Maissi</option> <option value="tomato">Tomaatti</option> </select> </> ); }
Aluksi valitun valinnan tarjoaminen
Oletuksena, selain valitsee ensimmäisen <option>
-komponentin listasta. Valitaksesi eri vaihtoehdon oletuksena, välitä sen <option>
-komponentin value
-arvo <select>
-komponentille defaultValue
-propsina.
export default function FruitPicker() { return ( <label> Valitse hedelmä: <select name="selectedFruit" defaultValue="orange"> <option value="apple">Omena</option> <option value="banana">Banaani</option> <option value="orange">Appelsiini</option> </select> </label> ); }
Usean valinnan mahdollistaminen
Välitä multiple={true}
<select>
-komponentille, jotta käyttäjä voi valita useita vaihtoehtoja. Tässä tapauksessa, jos määrität myös defaultValue
-propsin valitaksesi aluksi valitut vaihtoehdot, sen täytyy olla taulukko.
export default function FruitPicker() { return ( <label> Valitse muutama hedelmä: <select name="selectedFruit" defaultValue={['orange', 'banana']} multiple={true} > <option value="apple">Omena</option> <option value="banana">Banaani</option> <option value="orange">Appelsiini</option> </select> </label> ); }
Valintalistan arvon lukeminen lomakkeen lähetyksessä
Lisää <form>
valintalistan ympärille, jossa on <button type="submit">
sisällä. Se kutsuu <form onSubmit>
-käsittelijäfunktiota. Oletuksena, selain lähettää lomakkeen datan nykyiseen URL:iin ja päivittää sivun. Voit ohittaa tämän käyttäytymisen kutsumalla e.preventDefault()
. Lue lomakkeen data new FormData(e.target)
avulla.
export default function EditPost() { function handleSubmit(e) { // Estä selainta lataamasta sivua uudelleen e.preventDefault(); // Lue lomakkeen data const form = e.target; const formData = new FormData(form); // Voit välittää formData:n suoraan fetchin bodylle: fetch('/some-api', { method: form.method, body: formData }); // Voit generoida siitä URL:n, kuten selain tekee oletuksena: console.log(new URLSearchParams(formData).toString()); // Voit käsitellä sitä tavallisena oliona. const formJson = Object.fromEntries(formData.entries()); console.log(formJson); // (!) Tämä ei sisällä usean valinnan arvoja // Tai voit saada nimi-arvo parien taulukon. console.log([...formData.entries()]); } return ( <form method="post" onSubmit={handleSubmit}> <label> Valitse lempihedelmäsi: <select name="selectedFruit" defaultValue="orange"> <option value="apple">Omena</option> <option value="banana">Banaani</option> <option value="orange">Appelsiini</option> </select> </label> <label> Valitse kaikki lempivihanneksesi: <select name="selectedVegetables" multiple={true} defaultValue={['corn', 'tomato']} > <option value="cucumber">Kurkku</option> <option value="corn">Maissi</option> <option value="tomato">Tomaatti</option> </select> </label> <hr /> <button type="reset">Nollaa</button> <button type="submit">Lähetä</button> </form> ); }
Valintalistan ohjaaminen tilamuuttujalla
Valintalista kuten <select />
on kontrolloimaton. Vaikka välittäisit aluksi valitun arvon kuten <select defaultValue="orange" />
, JSX:si määrittelee vain aluksi valitun arvon, ei arvoa juuri nyt.
Renderöidäksesi kontrolloidun valintalistan, välitä sille value
-propsi. React pakottaa valintalistan aina sisältämään välittämäsi value
-arvon. Tyypillisesti, ohjaat valintalistaa määrittämällä tilamuuttujan:
function FruitPicker() {
const [selectedFruit, setSelectedFruit] = useState('orange'); // Määritä tilamuuttuja...
// ...
return (
<select
value={selectedFruit} // ...pakota valintalistan arvo vastaamaan tilamuuttujaa...
onChange={e => setSelectedFruit(e.target.value)} // ... ja päivitä tilamuuttuja muutoksissa!
>
<option value="apple">Omena</option>
<option value="banana">Banaani</option>
<option value="orange">Appelsiini</option>
</select>
);
}
Tämä on hyödyllistä, jos haluat renderöidä uudelleen osan käyttöliittymästä jokaisen valinnan jälkeen.
import { useState } from 'react'; export default function FruitPicker() { const [selectedFruit, setSelectedFruit] = useState('orange'); const [selectedVegs, setSelectedVegs] = useState(['corn', 'tomato']); return ( <> <label> Valitse hedelmä: <select value={selectedFruit} onChange={e => setSelectedFruit(e.target.value)} > <option value="apple">Omena</option> <option value="banana">Banaani</option> <option value="orange">Appelsiini</option> </select> </label> <hr /> <label> Valitse kaikki lempivihanneksesi: <select multiple={true} value={selectedVegs} onChange={e => { const options = [...e.target.selectedOptions]; const values = options.map(option => option.value); setSelectedVegs(values); }} > <option value="cucumber">Kurkku</option> <option value="corn">Maissi</option> <option value="tomato">Tomaatti</option> </select> </label> <hr /> <p>Lempihedelmäsi: {selectedFruit}</p> <p>Lempivihanneksesi: {selectedVegs.join(', ')}</p> </> ); }