<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
: String ํ์ ์ด๋ฉฐ ์ฌ์ฉ ๊ฐ๋ฅํ ์๋ ์์ฑ ๋์ ์ค ํ๋๋ฅผ ์ง์ ํฉ๋๋ค.autoFocus
: boolean ํ์ ์ด๋ฉฐtrue
๋ผ๋ฉด React๋ ๋ง์ดํธ ์ ์๋ฆฌ๋จผํธ์ ์ง์คํฉ๋๋ค.children
:<select>
๋<option>
,<optgroup>
๊ทธ๋ฆฌ๊ณ<datalist>
์ ํ์ ์ปดํฌ๋ํธ๋ฅผ ํ์ฉํฉ๋๋ค. ํ์ฉ๋ ์ปดํฌ๋ํธ ์ค ํ๋๋ฅผ ์ ๋ฌํด ๋ ๋๋งํ ์ ์์ต๋๋ค.<option>
ํ๊ทธ๋ฅผ ๋ ๋๋งํ๋ ์ปดํฌ๋ํธ๋ฅผ ์ ๋ฌํ๋ ๊ฒฝ์ฐ, ๊ฐ<option>
์๋value
๊ฐ ์์ด์ผ ํฉ๋๋ค.disabled
: boolean ํ์ ์ด๋ฉฐtrue
๋ผ๋ฉด select box์๋ ์ํธ์์ฉํ ์ ์๊ณ ํ๋ฆฟํ๊ฒ ๋ณด์ ๋๋ค.form
: String ํ์ ์ด๋ฉฐ select box์ ์ํ<form>
์id
๋ฅผ ์ง์ ํฉ๋๋ค. ์๋ตํ๋ฉด ๊ฐ์ฅ ๊ฐ๊น์ด ๋ถ๋ชจ ํผ์id
๊ฐ ์ง์ ๋ฉ๋๋ค.multiple
: boolean ํ์ ์ด๋ฉฐtrue
๋ผ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ๋ค์ค ์ ํ์ ํ์ฉํฉ๋๋ค.name
: String ํ์ ์ด๋ฉฐ select box์ ํผ์ ์ ์ถํ ๋ ์ ์ถ๋๋ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค.onChange
:Event
ํธ๋ค๋ฌ ํจ์์ ๋๋ค. ์ ์ด๋์ด์ผ ํ๋ select box์ธ ๊ฒฝ์ฐ ํ์์ ๋๋ค. ์ฌ์ฉ์๊ฐ ๊ฐ์ ๋ณ๊ฒฝํ ๋๋ง๋ค ์ฆ์ ํธ์ถ๋ฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์input
์ด๋ฒคํธ์ ์ ์ฌํ๊ฒ ๋์ํฉ๋๋ค.onChangeCapture
:onChange
์ ๊ฐ์ง๋ง ์บก์ฒ ๋จ๊ณ์์ ํธ์ถ๋ฉ๋๋ค.onInput
:Event
ํธ๋ค๋ฌ ํจ์์ ๋๋ค. ์ฌ์ฉ์๊ฐ ๊ฐ์ ๋ณ๊ฒฝํ ๋๋ง๋ค ์ฆ์ ํธ์ถ๋ฉ๋๋ค. React์์๋onChange
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ด์ต์ด์ง๋ง,onInput
๊ณผ ์ ์ฌํ๊ฒ ๋์ํฉ๋๋ค.onInputCapture
:onInput
์ ๊ฐ์ง๋ง ์บก์ฒ ๋จ๊ณ์์ ํธ์ถ๋ฉ๋๋ค.onInvalid
:Event
ํธ๋ค๋ฌ ํจ์์ ๋๋ค. ํผ ์ ์ถ ์ ์ ๋ ฅ์ด ์ ํจํ์ง ์์ผ๋ฉด ํธ์ถ๋ฉ๋๋ค. ๋ด์ฅ๋invalid
์ด๋ฒคํธ์ ๋ฌ๋ฆฌ ReactdmlonInvalid
์ด๋ฒคํธ๋ ๋ฒ๋ธ๋ง๋ฉ๋๋ค.onInvalidCapture
:onInvalid
์ ๊ฐ์ง๋ง ์บก์ฒ ๋จ๊ณ์์ ํธ์ถ๋ฉ๋๋ค.required
: boolean ํ์ ์ด๋ฉฐtrue
๋ผ๋ฉด ํผ ์ ์ถ ์ ๊ฐ์ ์ ๊ณตํด์ผ ํฉ๋๋ค.size
: ์ซ์ ํ์ ์ด๋ฉฐmultiple={true}
์ธ ๊ฒฝ์ฐ ์ฒ์ ๋ณด์ฌ์ง๋ ์์ดํ ๊ฐ์๋ฅผ ์ง์ ํฉ๋๋ค.
์ฃผ์ ์ฌํญ
- 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> </> ); }