Section3 Unit3 [React] Custom Component
- ๊ณผ์ React Custom Component (Advanced Challenge)
โญ๏ธ ๊ณผ์ . React Custom Component
์ง๋ Bare Minimum ๊ตฌํ์ ์ด์ด ์ด๋ฒ์๋ Advanced ๊ตฌํ์ ์๋ฃํ๋ค.
๐ท๏ธ Advanced Challenge: Autocomplete, ClickToEdit
โ๏ธ ๊ตฌํ ๊ณผ์ & ์ฝ๋
→ ๋ชฐ๋๊ฑฐ๋ ํท๊ฐ๋ ธ๋ ๋ถ๋ถ ์์ฃผ๋ก โจ๋ฉ๋ชจ
5. Autocomplete
ํ ์คํธ input์ ๊ฐ์ ์ ๋ ฅํ๋ฉด, dropdown์ผ๋ก input ๊ฐ๊ณผ ์ ์ฌํ ์ถ์ฒ ๊ฒ์ ์ต์ ์ ๋ณด์ฌ์ฃผ๋ ์๋ ์์ฑ ๊ธฐ๋ฅ์ผ๋ก ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์ํ ์ ์๋ค.
โจ handleKeyUp
// selected์ ์ด๊ธฐ๊ฐ์ -1 (์๋ฌด๊ฒ๋ ์ ํ๋์ง ์์ ์ํ)
const [selected, setSelected] = useState(-1);
const handleKeyUp = (e) => {
if (hasText) { // input ๊ฐ์ด ์์ ๋๋ง ๋์
// 1. ๋ง์ง๋ง ์ธ๋ฑ์ค๊น์ง ๊ฐ๋ฉด ๋ ์ด์ ์ด๋ํ์ง ์๋ ๋ฐฉ๋ฒ
if (e.key === "ArrowDown" && selected < options.length - 1) {
// option์ด 5๊ฐ์ผ ๊ฒฝ์ฐ, ์ธ๋ฑ์ค๋ 0-4๊น์ง
// selected๊ฐ 4๊ฐ ๋๋ฉด ๋์ด์ ์ฆ๊ฐํ์ง ์์
setSelected(selected + 1);
}
// 2. ๋ง์ง๋ง ์ธ๋ฑ์ค๊น์ง ๊ฐ๋ฉด ์ฒ์์ผ๋ก ๋์๊ฐ๋ ๋ฐฉ๋ฒ
/*
if (e.key === "ArrowDown" ) {
if (selected < options.length - 1) {
setSelected(selected + 1);
} else if (selected === options.length - 1) {
setSelected(0);
}
}
*/
if (e.key === "ArrowUp" && selected >= 0) {
// selected๊ฐ 0์ผ ๊ฒฝ์ฐ -1์ด ๋๊ณ ,
// selected๊ฐ -1์ผ ๊ฒฝ์ฐ ๋ ์ด์ ๋์ํ์ง ์์
setSelected(selected - 1);
}
if (e.key === "Enter" & selected >= 0) {
handleDropDownClick(options[selected]);
setSelected(-1); // seleccted ๊ฐ ์ด๊ธฐํ
}
}
};
๐ฌ Advanced Challenge ์์ Advanced ์๋ dropdown ํญ๋ชฉ์ ์ ํํ๊ณ , Enter ํค ์
๋ ฅ ์ input๊ฐ์ ์ ํ๋ dropdown ํญ๋ชฉ์ ๊ฐ์ผ๋ก ๋ณ๊ฒฝํ๋ handleKeyUp
ํจ์๋ฅผ ๋ง๋๋ ๋ถ๋ถ์ด ์ ์ผ ์ด๋ ค์ ์๋ค.
โจ handleInputChange
const handleInputChange = (event) => {
setInputValue(event.target.value);
setHasText(true);
setOptions( deselectedOptions.filter((el) => el.includes(event.target.value)) );
// ๋์๋ฌธ์ ๊ตฌ๋ถ์์ด ํํฐ
// setOptions( deselectedOptions.filter((el) => el.toLowerCase().includes(event.target.value.toLowerCase())) );
// ์คํ ๋ผ์ด๋ธ์ธ์
์ฝ๋
// startsWith : ํน์ ๋ฌธ์๋ก ์์ํ๋์ง ํ์ธํ์ฌ ๊ฒฐ๊ณผ๋ฅผ true ๋๋ false๋ก ๋ฐํ
// setOptions(deselectedOptions.filter((option) => option.startsWith(event.target.value)))
};
๐ฌ ๋์๋ฌธ์ ๊ตฌ๋ถ์์ด ํํฐํ๋ ๋ฐฉ๋ฒ๊ณผ startWith๋ฅผ ์ฌ์ฉํ ํํฐ๋งํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ์ง ๋ชปํ์๋๋ฐ, ๋ผ์ด๋ธ์ธ์ ์ ํตํด ์๊ฒ ๋์๋ค.
์ข ๋ ์๊ฐํด๋ณด๋ ๐ค ๊ฒ์์ ํ ๋ ๋์๋ฌธ์์ ๊ตฌ๋ถ์ด ์์๋ ๊ฒ ๊ฐ๊ณ , ๋๋ถ๋ถ์ ํน์ ๋ฌธ์๊ฐ ํฌํจ๋ ๊ฒ์์ด๊ฐ ์๋ ํน์ ๋ฌธ์๋ก ์์ํ๋ ๊ฒ์์ด๊ฐ ๋ ธ์ถ๋์๋ ๊ฒ ๊ฐ๋ค..!๐ก
๐ฌ ๊ทธ๋ฆฌ๊ณ ์์ ์๊ฐ์ ๋๊ตฐ๊ฐ ํ๊ธ ๊ฒ์์ ์์๋ง ์ ๋ ฅํด๋ ํฌํจ๋ ๋ฌธ์์ด์ด ๊ฒ์๋๋ ๋ฐฉ๋ฒ์ ์ง๋ฌธํ์๋ค. ์ด๊ฒ ๋ํ ์๊ฐํด๋ณด๋ ์์, ๋ชจ์๋ณ๋ก ๊ฒ์์ด ๊ฐ๋ฅํด์ผ ํ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
๊ทธ๋์ ํ๊ธ๋ฐ์ดํฐ๋ฅผ ์์, ๋ชจ์ ๋ณ๋ก ๊ฒ์ํ๊ณ ์ถ์ผ๋ฉด ํ๊ธ ์ ๋์ฝ๋ ์์๋ถ๋ฆฌ๋ฅผ ํด์ผํ๋ค๊ณ ํ๋ค.
์๋ฅผ ๋ค์ด "๊ณจ๋ํ" ๊ฒ์์ ใฑใ ในใทใ ใ ใ ใ ใ ์ด๋ ๊ฒ ์์๋ถ๋ฆฌ๋ฅผ ์ํค๋ ๊ฒ์ด๋ค.
๊ณจ๋ํ (searchData: [ใฑ,ใ
,ใน,ใท,ใ
,ใ
,ใ
,ใ
,ใ
])
๊ตฌํํด๋ณด๊ณ ์ถ๊ธฐ๋ ํ๋ฐ, ๋ค์ ์ง๋๊ฐ ๋ฐ๋น ์ ์ผ๋จ์ ํจ์คํ๊ณ ๋ฉ๋ชจ๋ง ํด๋์๋ค. ๋ด์ ๊ผญ ํด๋ด์ผ์ง..!
6. ClickToEdit
ClickToEdit ์ปดํฌ๋ํธ๋ input ์ฐฝ์ ํด๋ฆญํ๋ฉด ์์ ์ด ๊ฐ๋ฅํ๊ณ , input ์ฐฝ์ด ์๋ ๋ค๋ฅธ ๊ณณ์ ํด๋ฆญํ๋ฉด ์์ ํ ๋ด์ฉ์ด ๋ฐ์๋๋ ๊ธฐ๋ฅ์ ๊ฐ์ง ์ปดํฌ๋ํธ์ด๋ค.
ClickToEdit์ ์ ๋ง ๋ฌด๋ํ๊ฒ ๊ตฌํ ์๋ฃํด์ ํน๋ณํ ์ด๋ ค์ด ๋ถ๋ถ์ ์์๋ค.
๋์ UI๊ฐ ์ข ๋ณ๋ก๋ผ์ CSS๋ฅผ ๊น๋ํ๊ฒ ์์ ํด์ ์ข ๋ ๋ณด๊ธฐ์ข๊ฒ ๋ง๋ค์๋ค.
๊ตฌํํ๊ฑธ ํ ์คํธํ๋ค๊ฐ ํ๊ฐ์ง ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๋๋ฐ, ์๋์ฒ๋ผ ์๋ฌด๊ฒ๋ ์ ๋ ฅํ์ง ์์ ์ํ๋ก ๋ง์ฐ์ค๋ฅผ Blur ํ๊ฒ ๋๋ฉด ๋ค์ ์์ ์ด ์๋๋ ๋ถ๋ถ์ด์๋ค.
์ด๊ฑธ ๋ค์ ์ ๋ ฅ ๊ฐ๋ฅํ๋๋ก ๊ตฌํํด๋ณด๋ ค๊ณ ์ฒ์ ๋ ์ฌ๋ฆฐ ๋ฐฉ๋ฒ์, ์๋ฌด๊ฒ๋ ์ ๋ ฅ๋์ง ์์ ์ํ๋ก blur๊ฐ ๋๋ฉด ์ด์ ๊ฐ์ผ๋ก ๋๋๋ฆฌ๋ ๊ฒ์ด์๋ค. ๊ธฐ์กด ์ฝ๋์ ์กด์ฌํ๋ cache ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์ ํด๋ณด๋ ค๊ณ ํ๋๋ฐ, ์ ๋์ง๊ฐ ์์๋ค. ๋ฐฉ๋ฒ์ ์ข ๋ ์๊ฐํด๋ด์ผ๊ฒ ์ง๋ง, ํจ์ฌ ๋ ๊ฐ๋จํ ํด๊ฒฐ์ฑ ์ด ์์๋ค.
์ฌ์ ๋ ฅ์ด ์๋์๋ ์ด์ ๋ ์์ ์ ํ๊ธฐ ์ํด ํด๋ฆญ์ ํ๋ ๋ถ๋ถ์ธ span ์์์ ํฌ๊ธฐ๊ฐ ์ฌ๋ผ์ง๋ฉด์ ํด๋ฆญํ ๋ถ๋ถ์ด ์์ด์ง ๊ฒ์ด ๋ฌธ์ ์๋ค. ๊ทธ๋์ ๊ฐ๋จํ๊ฒ span ์์์ ํฌ๊ธฐ๋ฅผ ์ง์ ํด์ฃผ๋ฉด ๊ฐ๋จํ๊ฒ ํด๊ฒฐํ ์ ์๋ค.
export const InputBox = styled.div`
/* text-align: center; */
display: inline-block;
width: 200px;
height: 40px;
line-height: 40px;
border: 1px #bbb dashed;
border-radius: 10px;
margin-left: 1rem;
& span {
display:inline-block;
width: 100%;
height: 100%;
cursor: pointer;
}
`;
๊ทธ๋์ ์ด๋ ๊ฒ styled component๋ก ๊ตฌํํ InputBox ์ปดํฌ๋ํธ ํ์์ span ์์์ ํฌ๊ธฐ๋ฅผ ์ง์ ํด ์ฃผ์๋ค.
๐ ์ค๋์ ํ๊ณ
react custom component advanced ๊น์ง ์๋ฃํ๋ค. ์ปดํฌ๋ํธ๋ฅผ ์ง์ ๊ตฌํํ๋ ์์ ์ด ๊ฝค ์ฌ๋ฏธ์์๊ณ , ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ ์ง์ ๋ง๋ค์ด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์๋ค. ๋ฆฌ๋์ค๋ฅผ ๋ฌด๋ํ ๋๊ธด๋ค๋ฉด, ์ฃผ๋ง์ ํ ๋ฒ ๋์ ํด ๋ณด๋ ๊ฒ๋ ์ข์ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์๋ค. ๐
์ค๋ ๋ฐค์ ๋ด์ผ redux ํ์ต์ ์ํด ์์ต ์ข ํด์ผ๊ฒ ๋ค. ๋ฆฌ๋์ค๋ ์ด์ ์ ๊ณต๋ถ๋ฅผ ํ๊ธด ํ๋๋ฐ, ์ฐ์ด๋จน๊ธฐ ์์ผ๋ก ํด์ ๊ฑฐ์ ๊ธฐ์ต๋ ์๋๋ ๋ฏ ํ๋ค. ์ด๋ฒ์ ์ ๋๋ก ๊ณต๋ถํด์ผ์ง!
'Frontend Dev > ๐ฅ ์ฝ๋์คํ ์ด์ธ FE ๋ถํธ์บ ํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Section3 Unit4 [React] ์ํ ๊ด๋ฆฌ - Redux (0) | 2023.06.22 |
---|---|
Section3 Unit4 [React] ์ํ ๊ด๋ฆฌ (0) | 2023.06.21 |
Section3 Unit3 [React] Custom Component - ๊ณผ์ React Custom Component (Bare Minimum) (0) | 2023.06.19 |
Section3 Unit3 [React] Custom Component (0) | 2023.06.16 |
Section3 Unit2 [์ฌ์ฉ์ ์นํ ์น] UI/UX - Figma๋ก ์ค์นด์ด์ค์บ๋ ํด๋ก ํ๊ธฐ (0) | 2023.06.15 |