<select>
<select>
๋ด์ฅ ์ปดํฌ๋ํธ๋ ์ต์
์ ํฌํจํ๋ select box๋ฅผ ๋ ๋๋งํฉ๋๋ค.
<select>
<option value="someOption">Some option</option>
<option value="otherOption">Other option</option>
</select>
๋ ํผ๋ฐ์ค
<select>
select box๋ฅผ ํ์ํ๋ ค๋ฉด <select>
๋ด์ฅ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํด์ผ ํฉ๋๋ค.
<select>
<option value="someOption">Some option</option>
<option value="otherOption">Other option</option>
</select>
์๋ ๋ ๋ง์ ์์๊ฐ ์์ต๋๋ค.
Props
<select>
๋ ์ผ๋ฐ์ ์ธ ์๋ฆฌ๋จผํธ props๋ฅผ ์ง์ํฉ๋๋ค.
select box๋ฅผ ์ ์ดํ๋ ค๋ฉด value
prop์ ์ ๋ฌํด ์ฃผ์ธ์.
value
: String ํ์ (๋๋multiple={true}
์์ ์ฌ์ฉํ๋ String ๋ฐฐ์ด)์ด๋ฉฐ ์ด๋ค ์ต์ ์ ์ ํํ ์ง ์ ์ดํฉ๋๋ค.value
๋<select>
๋ด๋ถ์ ์ค์ฒฉ๋<option>
์value
์ ์ผ์นํฉ๋๋ค.
value
๋ฅผ ์ ๋ฌํ ๋, ์ ๋ฌ๋ value
๋ฅผ ์
๋ฐ์ดํธํ๋ onChange
ํธ๋ค๋ฌ๋ฅผ ์ ๋ฌํด์ผ ํฉ๋๋ค.
๋ง์ฝ <select>
๊ฐ ์ ์ด๋์ง ์๋๋ค๋ฉด, defaultValue
prop์ ์ ๋ฌํฉ๋๋ค.
defaultValue
: String ํ์ (๋๋multiple={true}
์์ ์ฌ์ฉํ๋ String ๋ฐฐ์ด)์ด๋ฉฐ ์ด๊ธฐ ์ ํ ์ต์ ์ ์ง์ ํฉ๋๋ค.
<select>
props๋ ์ ์ด๋์ง ์๋ ์ํ์ ์ ์ด๋๋ ์ํ ๋ชจ๋์ ์ ์ฉ๋ฉ๋๋ค.
autoComplete
: A string. Specifies one of the possible autocomplete behaviors.autoFocus
: A boolean. Iftrue
, React will focus the element on mount.children
:<select>
accepts<option>
,<optgroup>
, and<datalist>
components as children. You can also pass your own components as long as they eventually render one of the allowed components. If you pass your own components that eventually render<option>
tags, each<option>
you render must have avalue
.disabled
: A boolean. Iftrue
, the select box will not be interactive and will appear dimmed.form
: A string. Specifies theid
of the<form>
this select box belongs to. If omitted, itโs the closest parent form.multiple
: A boolean. Iftrue
, the browser allows multiple selection.name
: A string. Specifies the name for this select box thatโs submitted with the form.onChange
: AnEvent
handler function. Required for controlled select boxes. Fires immediately when the user picks a different option. Behaves like the browserinput
event.onChangeCapture
: A version ofonChange
that fires in the capture phase.onInput
: AnEvent
handler function. Fires immediately when the value is changed by the user. For historical reasons, in React it is idiomatic to useonChange
instead which works similarly.onInputCapture
: A version ofonInput
that fires in the capture phase.onInvalid
: AnEvent
handler function. Fires if an input fails validation on form submit. Unlike the built-ininvalid
event, the ReactonInvalid
event bubbles.onInvalidCapture
: A version ofonInvalid
that fires in the capture phase.required
: A boolean. Iftrue
, the value must be provided for the form to submit.size
: A number. Formultiple={true}
selects, specifies the preferred number of initially visible items.
์ฃผ์ ์ฌํญ
- HTML๊ณผ๋ ๋ฌ๋ฆฌ,
selected
์์ฑ์<option>
์ ์ ๋ฌํ๋ ๊ฒ์ ์ง์ํ์ง ์์ต๋๋ค. ๋์ , ์ ์ด๋์ง ์๋ select box์ธ ๊ฒฝ์ฐ<select defaultValue>
๋ฅผ ์ฌ์ฉํ๊ณ , ์ ์ด๋์ด์ผ ํ๋ select box์ธ ๊ฒฝ์ฐ<select value>
๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. <select>
์value
prop์ด ์ ๋ฌ๋๋ค๋ฉด, ์ ์ด๋๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํฉ๋๋ค.- select box๋ ์ ์ด ์ํ์ ๋น์ ์ด ์ํ๋ฅผ ๋์์ ํํ ์ ์์ต๋๋ค. ๋ ์ค ํ๋์ ์ํ๋ง ๊ฐ์ง ์ ์์ต๋๋ค.
- select box๋ ์๋ช ์ฃผ๊ธฐ ๋์ ์ฒ์ ์ค์ ํ ์ ์ด ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
- ์ ์ด๋๋ ๋ชจ๋ select box๋ ์ ๊ณต๋๋ ๊ฐ์ ๋๊ธฐ์ ์ผ๋ก ์
๋ฐ์ดํธํ๋
onChange
์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ํ์ํฉ๋๋ค.
์ฌ์ฉ ๋ฐฉ๋ฒ
์ต์ ์ด ๋ด๊ธด select box ํ์
<select>
๋ <option>
์ปดํฌ๋ํธ์ ๋ฆฌ์คํธ๋ฅผ ํฌํจํ๋ <select>
๋ฅผ ๋ ๋๋งํฉ๋๋ค. ๊ฐ <option>
์๋ ํผ๊ณผ ํจ๊ป ์ ์ถ๋๋ ๋ฐ์ดํฐ์ธ value
๋ฅผ ์ง์ ํฉ๋๋ค.
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 box๊ฐ ํฌํจ๋ ๋ผ๋ฒจ ์ ๊ณต
๋ผ๋ฒจ์ด ํด๋น select box์ ์ฐ๊ฒฐ๋์ด ์์์ ๋ธ๋ผ์ฐ์ ์ ์๋ฆฌ๊ธฐ ์ํด <label>
ํ๊ทธ ์์ <select>
๋ฅผ ๋ฐฐ์นํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ๋ผ๋ฒจ์ ํด๋ฆญํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ์๋์ผ๋ก ์ ํ ์์์ ์ด์ ์ ๋ง์ถฅ๋๋ค. ๋ํ, ์ ๊ทผ์ฑ์ ์ํด ํ์์ ์
๋๋ค. ์ฌ์ฉ์๊ฐ select box์ ์ด์ ์ ๋ง์ถ๋ฉด ์คํฌ๋ฆฐ ๋ฆฌ๋๊ฐ ๋ผ๋ฒจ ์บก์
์ ์๋ฆฝ๋๋ค.
<select>
๋ฅผ <label>
์์ ์ค์ฒฉ ์ํฌ ์ ์๋ค๋ฉด, ๊ฐ์ ID๋ฅผ <select id>
์ <label htmlFor>
์ ์ ๋ฌํ์ฌ ์ฐ๊ฒฐํด์ผ ํฉ๋๋ค. ํ ์ปดํฌ๋ํธ์์ ์ฌ๋ฌ ์ธ์คํด์ค ๊ฐ ์ถฉ๋์ ํผํ๋ ค๋ฉด useId
๋ฅผ ์ฌ์ฉํ์ฌ ID๋ฅผ ์์ฑํด ์ฃผ์ธ์.
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> </> ); }
์ด๊ธฐ ์ ํ ์ต์ ์ ๊ณต
๊ธฐ๋ณธ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ๋ ๋ชฉ๋ก์์ ์ฒซ ๋ฒ์งธ <option>
์ ์ ํํฉ๋๋ค. ๋ค๋ฅธ ์ต์
์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ ํํ๋ ค๋ฉด <select>
์๋ฆฌ๋จผํธ์ <option>
์ value
๋ฅผ defaultValue
๋ก ์ ๋ฌํด์ผ ํฉ๋๋ค.
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>
์ multiple={true}
๋ฅผ ์ ๋ฌํด์ผ ํฉ๋๋ค. ์ด๊ธฐ ์ ํ ์ต์
์ ์ ํํ๋ ค๋ฉด 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> ); }
ํผ์ ์ ์ถํ ๋ ์ ํ ์์์์ ์ ๊ณตํ๋ ๊ฐ ์ฝ๊ธฐ
๋ด๋ถ์ <button type="submit">
์ด ์๋ select box ์ฃผ๋ณ์ <form>
์ ์ถ๊ฐํ๋ฉด <form onSubmit>
์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ํธ์ถํด ๊ฐ์ ์ ๋ฌํ ์ ์์ต๋๋ค. ์๋ฌด๋ฐ ์ค์ ์ด ๋์ด ์์ง ์๋ค๋ฉด ๋ธ๋ผ์ฐ์ ๋ ์์ ๋ฐ์ดํฐ๋ฅผ ํ์ฌ URL๋ก ๋ณด๋ด๊ณ ํ์ด์ง๋ฅผ ์๋ก ๊ณ ์นฉ๋๋ค. e.preventDefault()
๋ฅผ ํธ์ถํ์ฌ ํด๋น ๋์์ ์ฌ์ ์ํ ์ ์์ต๋๋ค. new FormData(e.target)
๋ก ์์ ๋ฐ์ดํฐ ์ฝ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
export default function EditPost() { function handleSubmit(e) { // ๋ธ๋ผ์ฐ์ ์์ ํ์ด์ง๊ฐ ๋ค์ ๋ก๋๋์ง ์๋๋ก ์ค์ ํ ์ ์์ต๋๋ค. e.preventDefault(); // ํผ ๋ฐ์ดํฐ ์ฝ์ ์ ์์ต๋๋ค. const form = e.target; const formData = new FormData(form); // formData๋ฅผ ๊ฐ์ ธ์จ ๋ณธ๋ฌธ์ผ๋ก ์ง์ ์ ๋ฌํ ์ ์์ต๋๋ค. fetch('/some-api', { method: form.method, body: formData }); // ๋ธ๋ผ์ฐ์ ๊ฐ ์ํํ๋ ๊ฒ์ฒ๋ผ URL์ ์์ฑํ ์ ์์ต๋๋ค. console.log(new URLSearchParams(formData).toString()); // ์ผ๋ฐ ์ค๋ธ์ ํธ๋ก ์์ ํ ์ ์์ต๋๋ค. const formJson = Object.fromEntries(formData.entries()); console.log(formJson); // (!) ์ฌ๊ธฐ์๋ ๋ ๊ฐ ์ด์์ ์ ํ ๊ฐ์ด ํฌํจ๋์ง ์์ต๋๋ค. // ๋๋ ์ด๋ฆ-๊ฐ ์์ ๋ฐฐ์ด์ ์ป์ ์ ์์ต๋๋ค. 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> ); }
์ํ ๋ณ์์ ํจ๊ป select box ์ ์ด
<select>
์ ๊ฐ์ select box๋ ์ ์ด๋์ง ์์ต๋๋ค. <select defaultValue="orange" />
์ ๊ฐ์ด ์ฒ์์ ์ ํํ ๊ฐ์ ์ ๋ฌํ๋๋ผ๋ JSX๋ ํ์ฌ ๊ฐ์ด ์๋ ์ด๊ธฐ ๊ฐ๋ง ์ง์ ํฉ๋๋ค.
์ ์ด๋ select box๋ฅผ ๋ ๋๋งํ๋ ค๋ฉด value
prop์ ์ ๋ฌํด์ผ ํฉ๋๋ค. React๋ select box๊ฐ ํญ์ ์ ๋ฌํ value
๋ฅผ ๊ฐ๋๋ก ๊ฐ์ ํฉ๋๋ค. ๋ณดํต ์ํ ๋ณ์๋ก ์ ์ธํ์ฌ ์ ํ ์์๋ฅผ ์ ์ดํฉ๋๋ค.
function FruitPicker() {
const [selectedFruit, setSelectedFruit] = useState('orange'); // ์ํ ๋ณ์๋ฅผ ์ ์ธํฉ๋๋ค.
// ...
return (
<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>
);
}
๋ชจ๋ ์ ํ์ ๋ํ ์๋ต์ผ๋ก UI ์ผ๋ถ๋ฅผ ๋ค์ ๋ ๋๋งํ๋ ค๋ ๊ฒฝ์ฐ ์ ์ฉํฉ๋๋ค.
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> </> ); }