๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

Project: ๐Ÿšฉcodefolio - DropDown, PostTitle / as-is to-be : 1

ยท ์•ฝ 2๋ถ„
Seung hyo, Lee
Front End Engineer @ Assistfit
๐ŸŽฏ๋ชฉ์ 
  • DropDown component ์ƒ์„ฑ > ๊ฐœ์„ 
  • PostTitle component ์ƒ์„ฑ

1. DropDown Layout ๋งŒ๋“ค๊ธฐโ€‹

const DropDown = ({
defaultValue,
options,
}: DropDownProps<string | number>) => {
const handleChange = (e: React.ChangeEvent<HTMLSelectElement>) => {
e.preventDefault();
};

return (
<Select onChange={handleChange}>
{options.map((option) => (
<option key={option} value={option} defaultValue={defaultValue}>
{option}
</option>
))}
</Select>
);
};

export default DropDown;

prop ์œผ๋กœ ์ „๋‹ฌ๋ฐ›์€ defaultValue / options ๋ฅผ ํ™œ์šฉํ•ด select-box๋กœ ๋ณด์—ฌ์ฃผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.

์ฒ˜์Œ์—” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์™€์„œ ํ™œ์šฉํ•˜๋ ค๊ณ  ํ–ˆ์œผ๋‚˜, toast UI select ๋ฐ•์Šค๋Š” next๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ณ  SSR ์ง€์ •์„ ์ง์ ‘ ํ•ด์ค˜์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์œผ๋กœ ํƒํ•˜์ง€ ์•Š๊ณ 

styled components ๋ฅผ ์‚ฌ์šฉํ•ด ์ง์ ‘ ์Šคํƒ€์ผ์„ ์ง€์ •ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

์œ„ ์ฝ”๋“œ๋ฅผ ์งœ๊ณ  ๋‚˜๋‹ˆ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ ๋ถˆํŽธํ•˜๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์— ์ž ์ด ์˜ค์งˆ ์•Š๊ณ  ๋งˆ์Œ์ด ๋ฌด๊ฑฐ์› ๋‹ค. ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ง์ ‘ ๋ฐฐ์—ด์„ options์— ์ „๋‹ฌํ•ด์ค˜์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ.


2. DropDown component : as-is to-beโ€‹

/**
* @example
* <DropDown data="birth_year" />
* <DropDown data="careerer" />
* @TODO ์ปดํฌ๋„ŒํŠธ๋ณ„ ์Šคํƒ€์ผ ๋ถ„๋ฆฌ
*/
const DropDown = ({ data }: DropDownProps) => {
const [selectValue, setSelectValue] = useState("");

const options: string[] = [];
// const thisYears = new Date();
const years = Array.from(
{ length: new Date().getFullYear() - 1950 + 1 },
(_, i) => {
return new Date().getFullYear() - i;
}
);
if (data === "birth_year") {
years.forEach((year) => options.push(String(year)));
}
if (data === "careerer") {
for (let i = 1; i < 20; i += 1) {
options.push(`${i}๋…„์ฐจ`);
}
options.unshift("์‹ ์ž…");
options.push("20๋…„์ฐจ ์ด์ƒ");
}

const handleChange = (e: React.ChangeEvent<HTMLSelectElement>) => {
setSelectValue(e.target.value);
};
return (
<Select onChange={handleChange}>
{options.map((option) => (
<option key={option} value={option} defaultValue={option}>
{option}
</option>
))}
</Select>
);
};

๊ฐœ์„ ์•ˆ์€ ์ด๋Ÿฌํ–ˆ๋‹ค.

๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•˜๊ณ ์‹ถ์€ select box ๋‚ด์šฉ์„ ๋ฐ์ดํ„ฐ prop ์•ˆ์— ์ง€์ •ํ•ด ์ค€๋‹ค๋ฉด ๋‚ด๊ฐ€ ๋งŒ๋“  ์ปดํฌ๋„ŒํŠธ์—์„œ data ๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ options ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์นœ์ ˆํ•œ ์ปดํฌ๋„ŒํŠธ ์˜€๋‹ค.


3. PostTitleโ€‹

const PostTitle = () => {
const [title, setTitle] = useState("");
const [subTitle, setSubTitle] = useState("");

return (
<TitleContainer>
<TitleInput
value={title}
onChange={(e) => setTitle(e.target.value)}
placeholder="ํ”„๋กœ์ ํŠธ ์ œ๋ชฉ์„ ์ž…๋ ฅํ•˜์„ธ์š”"
/>
<SubTitleWrapper>
<SubTitleInput
value={subTitle}
onChange={(e) => setSubTitle(e.target.value)}
placeholder="์†Œ์ œ๋ชฉ์„ ์ž…๋ ฅํ•˜์„ธ์š”"
/>
</SubTitleWrapper>
</TitleContainer>
);
};

export default PostTitle;

์œ„ ๋ถ€๋ถ„์€ ์ž‘์—…์ค‘์ด๋‹ค!

๋ณ„ ๋‚ด์šฉ ์—†์ด title๊ณผ subtitle์˜ text๋ฅผ ๋ฐ›์•„์„œ state๋กœ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ๋‚ด์šฉ์ด๋‹ค. ์ถ”ํ›„ submit ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.