<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: ๋ฌธ์์ด ํ์ (๋๋multiple={true}์์ ์ฌ์ฉํ๋ ๋ฌธ์์ด ๋ฐฐ์ด)์ด๋ฉฐ ์ด๋ค ์ต์ ์ ์ ํํ ์ง ์ ์ดํฉ๋๋ค.value๋<select>๋ด๋ถ์ ์ค์ฒฉ๋<option>์value์ ์ผ์นํฉ๋๋ค.
value๋ฅผ ์ ๋ฌํ ๋, ์ ๋ฌ๋ value๋ฅผ ์
๋ฐ์ดํธํ๋ onChange ํธ๋ค๋ฌ๋ฅผ ์ ๋ฌํด์ผ ํฉ๋๋ค.
<select>๊ฐ ์ ์ด๋์ง ์๋๋ค๋ฉด, defaultValue Prop์ ์ ๋ฌํฉ๋๋ค.
defaultValue: ๋ฌธ์์ด ํ์ (๋๋multiple={true}์์ ์ฌ์ฉํ๋ ๋ฌธ์์ด ๋ฐฐ์ด)์ด๋ฉฐ ์ด๊ธฐ ์ ํ ์ต์ ์ ์ง์ ํฉ๋๋ค.
<select> Props๋ ์ ์ด๋์ง ์๋ ์ํ์ ์ ์ด๋๋ ์ํ ๋ชจ๋์ ์ ์ฉ๋ฉ๋๋ค.
autoComplete: ๋ฌธ์์ด ํ์ . ๊ฐ๋ฅํ ์๋์์ฑ ๋์ ์ค ํ๋๋ฅผ ์ง์ ํฉ๋๋ค.autoFocus: ๋ถ๋ฆฌ์ธ ํ์ .true์ด๋ฉด React๊ฐ ๋ง์ดํธ ์ ํด๋น ์์์ ํฌ์ปค์ฑํฉ๋๋ค.children:<select>๋ ์์์ผ๋ก<option>,<optgroup>,<datalist>์ปดํฌ๋ํธ๋ฅผ ๋ฐ์ต๋๋ค. ๋ํ ํ์ฉ๋๋ ์ปดํฌ๋ํธ ์ค ํ๋๋ฅผ ๋ ๋๋งํ๊ธฐ๋ง ํ๋ค๋ฉด ์ฌ์ฉ์ ์ ์ ์ปดํฌ๋ํธ๋ฅผ ์ ๋ฌํ ์๋ ์์ต๋๋ค. ์ต์ข ์ ์ผ๋ก<option>ํ๊ทธ๋ฅผ ๋ ๋๋งํ๋ ์ฌ์ฉ์ ์ ์ ์ปดํฌ๋ํธ๋ฅผ ์ ๋ฌํ๋ค๋ฉด, ๋ ๋๋ง๋๋ ๋ชจ๋<option>์value๋ฅผ ๊ฐ์ ธ์ผ ํฉ๋๋ค.disabled: ๋ถ๋ฆฌ์ธ ํ์ .true์ผ ๊ฒฝ์ฐ select box๋ ์ํธ์์ฉํ ์ ์๊ฒ ๋๊ณ ํ๋ฆฌ๊ฒ ํ์๋ฉ๋๋ค.form: ๋ฌธ์์ด ํ์ . ์ด select box๊ฐ ์ํ๋<form>์id๋ฅผ ์ง์ ํฉ๋๋ค. ์๋ต๋๋ฉด ๊ฐ์ฅ ๊ฐ๊น์ด ๋ถ๋ชจ ํผ์ผ๋ก ์ง์ ๋ฉ๋๋ค.multiple: ๋ถ๋ฆฌ์ธ ํ์ .true์ด๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ๋ค์ค ์ ํ์ ํ์ฉํฉ๋๋ค.name: ๋ฌธ์์ด ํ์ . ์์๊ณผ ํจ๊ป ์ ์ถ๋๋ select box์ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค.onChange:Eventํธ๋ค๋ฌ ํจ์. ์ ์ด๋๋ select box์ ํ์์ ์ ๋๋ค. ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ์ต์ ์ ์ ํํ๋ ์ฆ์ ์คํ๋ฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์input์ด๋ฒคํธ์ฒ๋ผ ๋์ํฉ๋๋ค.onChangeCapture: ์บก์ฒ ๋จ๊ณ์์ ์คํ๋๋ ๋ฒ์ ์onChange.onInput:Eventํธ๋ค๋ฌ ํจ์. ์ฌ์ฉ์์ ์ํด ๊ฐ์ด ๋ณ๊ฒฝ๋๋ ์ฆ์ ์คํ๋ฉ๋๋ค. ์ญ์ฌ์ ์ธ ์ด์ ๋ก React์์๋ ์ ์ฌํ๊ฒ ๋์ํ๋onChange๋ฅผ ๋์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ด์ฉ์ ์ ๋๋ค.onInputCapture: ์บก์ฒ ๋จ๊ณ์์ ์คํ๋๋ ๋ฒ์ ์inputCapture.onInvalid:Eventํธ๋ค๋ฌ ํจ์. ์์ ์ ์ถ ์ ์ ๋ ฅ ์ ํจ์ฑ ๊ฒ์ฌ์ ์คํจํ๋ฉด ์คํ๋ฉ๋๋ค. ๋ด์ฅinvalid์ด๋ฒคํธ์ ๋ค๋ฅด๊ฒ, React์onInvalid์ด๋ฒคํธ๋ ๋ฒ๋ธ๋ง๋ฉ๋๋ค.onInvalidCapture: ์บก์ฒ ๋จ๊ณ์์ ์คํ๋๋ ๋ฒ์ ์invalidCapture.required: ๋ถ๋ฆฌ์ธ ํ์ .true์ผ ๊ฒฝ์ฐ ์์์ ์ ์ถํ ๋ ๊ฐ์ด ๋ฐ๋์ ์ ๊ณต๋์ด์ผ ํฉ๋๋ค.size: ์ซ์ ํ์ .multiple={true}์ธ select์ ๋ํด, ์ด๊ธฐ์ ํ์๋๋ ๊ธฐ๋ณธ ํญ๋ชฉ์ ์๋ฅผ ์ง์ ํฉ๋๋ค.
์ฃผ์ ์ฌํญ
- HTML๊ณผ๋ ๋ฌ๋ฆฌ,
selected์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ<option>์ ์ ๋ฌํ๋ ๊ฒ์ ์ง์ํ์ง ์์ต๋๋ค. ๋์ , ์ ์ด๋์ง ์๋ select box์ธ ๊ฒฝ์ฐ<select defaultValue>๋ฅผ ์ฌ์ฉํ๊ณ , ์ ์ด๋์ด์ผ ํ๋ select box์ธ ๊ฒฝ์ฐ<select value>๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. <select>์valueProp์ด ์ ๋ฌ๋๋ค๋ฉด, ์ ์ด๋๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํฉ๋๋ค.- 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 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์ ๋ณธ๋ฌธ์ผ๋ก ์ง์ ์ ๋ฌํ ์ ์์ต๋๋ค. 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> ); }
State ๋ณ์์ ํจ๊ป select box ์ ์ด
<select>์ ๊ฐ์ select box๋ ์ ์ด๋์ง ์์ต๋๋ค. <select defaultValue="orange" />์ ๊ฐ์ด ์ฒ์์ ์ ํํ ๊ฐ์ ์ ๋ฌํ๋๋ผ๋ JSX๋ ํ์ฌ ๊ฐ์ด ์๋ ์ด๊ธฐ ๊ฐ๋ง ์ง์ ํฉ๋๋ค.
์ ์ด๋ select box๋ฅผ ๋ ๋๋งํ๋ ค๋ฉด value Prop์ ์ ๋ฌํด์ผ ํฉ๋๋ค. React๋ select box๊ฐ ํญ์ ์ ๋ฌํ value๋ฅผ ๊ฐ๋๋ก ๊ฐ์ ํฉ๋๋ค. ๋ณดํต State ๋ณ์๋ก ์ ์ธํ์ฌ ์ ํ ์์๋ฅผ ์ ์ดํฉ๋๋ค.
function FruitPicker() {
const [selectedFruit, setSelectedFruit] = useState('orange'); // State ๋ณ์๋ฅผ ์ ์ธํฉ๋๋ค.
// ...
return (
<select
value={selectedFruit} // ...select์ ๊ฐ์ด State ๋ณ์์ ์ผ์นํ๋๋ก ๊ฐ์ ํฉ๋๋ค....
onChange={e => setSelectedFruit(e.target.value)} // ... ๋ณ๊ฒฝ ์ฌํญ์ด ์์ ๋๋ง๋ค State ๋ณ์๋ฅผ ์
๋ฐ์ดํธ ํฉ๋๋ค!
>
<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> </> ); }