๐ค any ์ง์ํ๊ธฐ.
์กธ์ ์ํ์ ํ๋ก ํธ๋ฅผ Next.js + TypeScript๋ก ์์ฑํ๊ณ ์๋ค.
์์ ์ปดํฌ๋ํธ์์์ ์ํธ ์์ฉ์ด state๋ฅผ ๋ณ๊ฒฝ์์ผ์ผ ํ ํ์๊ฐ ์์ด์ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ์ ์ธ๋ setState ํจ์๋ฅผ ์์ ์ปดํฌ๋ํธ์ props๋ก ๋๊ฒจ์ฃผ๋ฉด์ ์๋ฌธ์ด ์๊ฒผ๋ค.
TypeScript๋ฅผ ํตํ React ๊ฐ๋ฐ์์ ๋ณดํต props๋ฅผ ๋๊ฒจ๋ฐ์ ๋, interface๋ type alias๋ฅผ ํ์ฉํ์ฌ ํด๋น props์ ํ์ ์ ์ง์ ํด์ฃผ๊ณ ๋ ํ๋๋ฐ, props๋ก number, string ๊ฐ์ ์์ ํ์ ๋ง ๋๊ธฐ๋ ๊ฒ๋ ์๋๊ณ ๋๋๋ก ReactNode ๊ฐ์ ํ์ ๋ค๋ ๋๊ฒจ์ผ ํ ํ์๊ฐ ์๊ธฐ๊ณ ๋ ํ๋ค.
์ด์ ๊น์ง๋ ReactNode๋ HTML ์๋ฆฌ๋จผํธ, setState ํจ์ ๋ฑ์ props๋ก ๋๊ฒจ์ค ๋์ ์ ํํ ํ์ ์ ๋ชฐ๋ผ any๋ก ์ง์ ํ์ฌ ์ฌ์ฉํ๋๋ฐ, ์ด๋ฒ ํ๋ก์ ํธ์์๋ ์ง๊ธ๊น์ง์ ์๋ชป๋ ์ต๊ด์ ๋ค์ก๊ณ ์ ํ์ ์ง์ ์ ์์คํ๊ฒ ์ง์ผ๋๊ฐ๋ฉฐ ๊ฐ๋ฐ์ ํ๊ณ ์๋ ์ค์ด๋ค. ๋ฐ๋ผ์ ์ค๋ ์๋ก์ด ๋ฐฐ์ด ๋ด์ฉ์ ์ ๋ฆฌํด๋ณผ๊น ํ๋ค.
๐ฆ ๋ฌธ์ ์ ์ปดํฌ๋ํธ
interface SelectOption {
value: number | string;
name: string
}
interface Props {
selectOption : SelectOption[];
setOption: React.Dispatch<React.SetStateAction<number>>;
}
const SelectBox = ({selectOption, setOption} : Props) => {
const onChangeHandler = (e : React.ChangeEvent<HTMLSelectElement>) => {
setOption(parseInt(e.target.value));
}
return(
<SelectStyle onChange={onChangeHandler}>
{selectOption.map((item, index) => (
<option key={index} value={item.value}>{item.name}</option>
))}
</SelectStyle>
);
};
SelectBox ์ปดํฌ๋ํธ๋ ์ฐ๋ฆฌ์ ํ๋ก์ ํธ์์ ํ์์ ํ๋ ๋ณ ์ ๋ณด๋ฅผ ์ ํํด ๋ณด์ฌ์ฃผ๊ธฐ ์ํ <select>๋ฅผ ์ฌํ์ฉํ๊ธฐ ์ํด ๋ณ๋๋ก ๋ถ๋ฆฌํ ์ปดํฌ๋ํธ๋ค. props๋ก SelectOption ์ธํฐํ์ด์ค๋ก ์ง์ ํ ํ์ ์ setOption์ ํ์ ์ง์ ๊ณผ ๋ณํฉํ์ฌ Props ํ์ ์ผ๋ก ํ๋ selectOption๊ณผ setOption์ ๋ฐ๋๋ค.
setOption์ ์ฌ์ฉ์๊ฐ <select> ์๋ฆฌ๋จผํธ๋ฅผ ํตํด ๋ค๋ฅธ <option>์ ์ ํํ์ ๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ๋ณ๊ฒฝ๋ ๊ฐ์ ๋ค๋ฃจ๊ธฐ ์ํด ๋ด๋ ค๋ฐ๋ setState ํจ์๋ค.
์ง๊ธ์์์ผ ๋ฌผ๋ก ์์ฑ์ด ๋์์ผ๋ ์๋ฒฝํ๊ฒ ํ์ ์ง์ ์ด ๋์ด์์ง๋ง, ๋นจ๊ฐ ์ง๋ ์ด๋ฅผ ๋ง์ด ๋ง๋์ผ ํ๋ค.
๐ React.Dispatch<React.setStateAction<number>>
VSC์์๋ ESLint ๋ฑ์ ํ์ฅ์ ํ์ฉํ๋ฉด ๋ณด๋ค ํธ์ํ๊ฒ ๊ฐ๋ฐ์ ํ ์ ์๊ณ , TypeScript์ ๋ฆฐํธ ๋ํ ์ ์ฉ๋ ์ํ์ด๋ฏ๋ก ์ฌ์ฉํ๋ ์์์ ์ปค์๋ฅผ ์ฌ๋ฆฌ๋ฉด ํด๋น ์์์ ํ์ ์ ํ์ธํ ์ ์๋ค.
์์์ ์ค๋ช ํ setOption ํจ์์ ์ปค์๋ฅผ ์ฌ๋ฆด ๊ฒฝ์ฐ ํ์ ์ด Dispatch<SetStateAction<number>> ๋ผ๊ณ ์๋ ค์ฃผ๊ณ ์๋ค.
ํ์ง๋ง ์ด๋ฅผ ๊ณง์ด๊ณง๋๋ก ์ธํฐํ์ด์ค์ Dispatch<SetStateAction<number>> ๋ผ๊ณ ๊ธฐ์ ์ ํด์ฃผ๋ฉด
์ฅ... ์๋๋ค.
๊ทธ๋์ ReactNode ํ์ ์ ์ฌ์ฉํ ๋, React.ReactNode ์ฒ๋ผ namespace๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด ํด๊ฒฐ์ด ๋ ๊น ์ถ์ด React.Dispatch<React.SetStateAction<number>>๋ก ์ง์ ํด์ฃผ๋ ์ค๋ฅ๋ฅผ ์์จ ์ ์์๋ค.
์ ํด๊ฒฐ์ด ๋์์ง๋ง ์ ๋์๋์ง๋ฅผ ๋ชจ๋ฅด๋ ์ด ๋ถ๋ถ์ ๋ํด์ ๋ ๊ณต๋ถ๋ฅผ ํด๋ด์ผ๊ฒ ๋ค.
โผ๏ธ event์ ํ์ ์ ๋ญ๊น?
๊ทธ๋ฆฌ๊ณ SelectBox ์ปดํฌ๋ํธ์์ <select> ์๋ฆฌ๋จผํธ์ onChange ์ด๋ฒคํธํธ๋ค๋ฌ๋ฅผ ๊ตฌํํ๋ฉฐ ๋ค์ ํ์ ์ง์ ์ ๋๊ด์ ๋ด์ฐฉํ๋ค.
๋ณดํต ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์๋ฅผ ์ ์ํ ๋ ์ฌ์ฉํ๋ ์ด๋ฒคํธ ๋งค๊ฐ๋ณ์ e, event... ๋ ์ด๋ค ํ์ ์ ์ง์ ์ ํด์ค์ผ ํ ๊น?
onClick ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ๋์๋ ๋ณดํต React.MouseEvent ํ์ ์ ์ฌ์ฉํ๊ณ ๋ ํ์๋ค. ๊ทธ๋ ๋ค๋ฉด onChange์์์ ์ด๋ฒคํธ ๋งค๊ฐ๋ณ์์ ํ์ ์ ๊ณผ์ฐ ๋ญ๊น? ์ฒ์์๋ ๋น์ฐํ React.ChangeEvent๋ก ์์ฑ์ ํด๋ณด์๋๋ฐ...
'EventTarget & Element' ํ์์ 'value' ์์ฑ์ด ์์ต๋๋ค. ๋ผ๊ณ ํ๋ค. ์ด๋ Element ํ์ ์ ์ ํํ ์ง์ ํด์ฃผ์ง ์์์ ๊ทธ๋ฐ ๊ฒ ๊ฐ๋ค. ๋ฐ๋ผ์ <T>๋ฅผ ํ์ฉํด HTMLSelectElement ํ์ ์ ์ง์ ํจ์ผ๋ก์จ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์๋ค.
์ด๊ฒ ์ญ์ '์ ๋ฒ์๋ React.MouseEvent' ์์ผ๋๊น ์ด๊ฑด Change๊ฐ ๋ค์ด๊ฐ์ง ์์๊น?' ํ๋ ์๊ฐ์์ VSC์ ์๋์์ฑ ๊ธฐ๋ฅ์ ํตํด ํ๋ํ๋ ๋ฃ์ด๋ณด๊ณ ์์๋ธ ๊ฑฐ๋ผ ์ ๋๋์ง๋ ๋ชจ๋ฅด๊ฒ ๋ค. ํ์ ์คํฌ๋ฆฝํธ์ ๋ค์ด๊ฐ ์ ์๋ ํ์ (ํนํ ํ ํ๋ฆฟ)์ ๋ํ ํ์ต์ ๋ ํด๋ด์ผ๊ฒ ๋ค. React ๋ค์์คํ์ด์ค์ ํ์ ์ ์ฐ๋๊ฒ๋ ์ด๋ฒ์ ์ฒ์ ์๊ฒ๋์๊ธฐ ๋๋ฌธ์...
'Web Programming > React.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React.js] React์์ ํ์ด์ง๋ค์ด์ ๊ตฌํํ๊ธฐ (1) | 2023.10.18 |
---|---|
[React.js] create-react-app์ผ๋ก ๋ฆฌ์กํธ ์ฑ ์์ํ๊ธฐ (0) | 2021.12.09 |