์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- ๋ฆฌ์กํธ
- ์๋ฌ
- ๋ถํธ์บ ํ
- ๋ด์ผ๋ฐฐ์
- Redux
- native
- ๋ด์ผ๋ฐฐ์์บ ํ
- ์จ๋ผ์ธ
- JavaScript
- ํ๋ก ํธ์๋
- ์ฝ๋ฉ
- trainning
- JS
- ํ์ค
- ๊ฐ๋ฐ์
- API
- ์๊ณ ๋ฆฌ์ฆ
- ํ์
- NEXT
- K-Digital
- ํ๋ก์ ํธ
- rn
- react
- type
- ํจ์
- wil
- Firebase
- ์๋ฐ์คํฌ๋ฆฝํธ
- PROJECT
- ๋ณ์
- Today
- Total
Frontend ๊ฐ๋ฐ์ - hyo.loui
Project: ๐ฉcodefolio - DropDown, PostTitle / as-is to-be : 1 ๋ณธ๋ฌธ
๐ฏ๋ชฉ์ :
DropDown componenet ์์ฑ > ๊ฐ์
PostTitle componenet ์์ฑ
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 componenets ๋ฅผ ์ฌ์ฉํด ์ง์
์คํ์ผ์ ์ง์ ํ๊ธฐ๋ก ํ๋ค.
์ ์ฝ๋๋ฅผ ์ง๊ณ ๋๋
์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋๋ฐ ์์ด์ ๋ถํธํ๊ฒ ๋ค๋ ์๊ฐ์
์ ์ด ์ค์ง ์๊ณ ๋ง์์ด ๋ฌด๊ฑฐ์ ๋ค.
๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์ง์ ๋ฐฐ์ด์ 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 ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ ํ ๋ ์ฌ์ฉํ๊ธฐ ์ํจ์ด๋ค.
'Project' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Project: ๐ฉcodefolio - recoil, supabase Auth (0) | 2023.02.16 |
---|---|
Project: ๐ฉcodefolio - Toast UI Editor ์ฌ์ง ์ ๋ก๋ (0) | 2023.02.16 |
Project: ๐ฉcodefolio - ESlint, prettierrc ์ค์ ํ๊ธฐ / as-is to-be : 2 (0) | 2023.02.10 |
Project: ๐ฉcodefolio - supabase API (0) | 2023.02.08 |
Project: ๐ฉcodefoliol - ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ (0) | 2023.02.07 |