-
์ปค์คํ ํ ๊ณผ ํจ๊ป ์ปดํฌ๋ํธ์ ๊ทธ ์กฐ์ ๋ก์ง์ ์ถ์ํํด๋ณด์!๐ JavaScript 2023. 8. 20. 20:17
๐ ๋ฐฐ๊ฒฝ
์๋ ์ด๋ฏธ์ง์ ๊ฐ์ด ์ฝํ ์ธ ๋ฅผ ๋์ ์ผ๋ก ๋ฐ๊ฟ ์ ์๊ณ & ๋ณด์ฌ์ฃผ๋ ์์ ์ผ๋ก๋ถํฐ 3์ด ํ ์ธ๋ง์ดํธ๋๋ ์ค๋ต๋ฐ๋ฅผ ๊ฐ๋ฐํ์๋ค.
๋ชจ๋ ์ค๋ต๋ฐ ์ปดํฌ๋ํธ์ ๋ง์ดํธ ๋ 3์ด ํ ์ธ๋ง์ดํธ๋๋ ๋ก์ง์ ์ ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์ด, ํน์ ์ปดํฌ๋ํธ์ ๋ฐ๋ณต์ ์ผ๋ก ์ ์ฉํ ๋ก์ง์ด ์๋ ๊ฒฝ์ฐ, ๊ทธ ์ฝ๋๋ฅผ ์์งํ ์ํฌ ์ ์๋ ๋ฐฉ์์ ๋ํด ๊ณ ๋ฏผํด๋ณด์๋ค.
๐ ๊ฒฐ๊ณผ๋ฌผ
์ค๋ต๋ฐ ์์ ๐ ์์ ์
๋ค์์ ์ค๋ต๋ฐ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๊ณ ์ฌ์ฉํ๋ ๊ตฌ๋ฌธ์ด๋ค. content prop์ผ๋ก ๋ด๋ถ ์ฝํ ์ธ ๋ฅผ ๋์ ์ผ๋ก ๋ฐ์์ฌ ์ ์์ผ๋ฉฐ, ์ค๋ต๋ฐ๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์ถ์ ๋ Main ๊ตฌ๋ฌธ ๋ด activateSnackbar ํจ์๋ฅผ ํธ์ถํ์ฌ, ๊ทธ ์์ ์ผ๋ก๋ถํฐ 3์ด๊ฐ ์ง๋ ์์ ์ ์ค๋ต๋ฐ๊ฐ ์๋์ผ๋ก unmount ๋๋ค.
// ์ค๋ต๋ฐ ์ปดํฌ๋ํธ ์ ์ธ function Snackbar({content}: {content: string}){ const transition = useTransition(isActive, { entering: { animation: `${slideIn} 0.5s ease-in-out forwards` }, exiting: { animation: `${slideOut} 0.5s ease-in-out forwards` }, }); return ( <HStack style={transition}> <CheckIcon/> {content} </HStack> ) }
// ์ค๋ต๋ฐ ์ปดํฌ๋ํธ ์ฌ์ฉ function Main(){ const [showSnackbar, setShowSnackbar] = useState(true) function activateSnackbar() { setShowSnackbar(true); setTimeout(() => setShowSnackbar(false), 3000); } return ( {showSnackbar && <Snackbar content="๋ฑ๋ก๋์์ด์."/>} ) }
ํ์ง๋ง
.
.
Main ์ปดํฌ๋ํธ ๋ฟ ์๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ์์ ์ค๋ต๋ฐ๊ฐ ์ฌ์ฉ๋๊ณ , 3์ด ํ ์ฌ๋ผ์ง๋ ๋ก์ง(activateSnackbar ํจ์)์ด ์ฌ๋ฌ ๋ฒ ์ฌ์ฉ๋๋ค๋ฉด?
๋ชจ๋ snackbar๋ฅผ 3์ด๊ฐ ์๋ 5์ด ๋ค์ ์ฌ๋ผ์ง๋๋ก ๋ณ๊ฒฝํ๋ค๋ฉด?
์ด์ ๊ฐ์ด ๋ณ๊ฒฝํ๊ฑฐ๋ ํ์ฅํด์ผ ํ ์ฝ๋๊ฐ ์์ ๋ ์ค๋ต๋ฐ๊ฐ ์ฌ์ฉ๋ ๋ชจ๋ ๋ถ๋ถ์ ๋ค์ ํ์ธํ๊ณ ์ถ๊ฐ/์ ๊ฑฐํด์ผ ํ๋ค๋ ๋ฌธ์ ๊ฐ ์์๊ณ , ๋์ฑ ์ ์ฐ์ฑ ์๋ ์ฝ๋๋ฅผ ๋ง๋ค๊ธฐ ์ํด, ๋ฐ๋ ์ ์๋ ๋ถ๋ถ์ ์ฐพ์๋ด๊ณ , ๋ฐ๋์ง ์๋ ๋ถ๋ถ์ ๋ถ๋ฆฌ์ํฌ ์ ์๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผํด ๋ณด์๋ค.
๐ ์์ ํ
// ์ค๋ต๋ฐ ์ปดํฌ๋ํธ ์ ์ธ function Snackbar({content}: {content: string}){ const transition = useTransition(isActive, { entering: { animation: `${slideIn} 0.5s ease-in-out forwards` }, exiting: { animation: `${slideOut} 0.5s ease-in-out forwards` }, }); return ( <HStack style={transition}> <CheckIcon/> {content} </HStack> ) }
// useSnackbar.tsx function useSnackbar( content: string, ): [boolean, () => void, () => JSX.Element] { const [showSnackbar, setShowSnackbar] = useState(true) function activateSnackbar() { setShowSnackbar(true); setTimeout(() => setShowSnackbar(false), 3000); } const Snackbar = () => <_Snackbar isActive={showSnackbar} content={content} />; // --- (1) return [showSnackbar, activateSnackbar, Snackbar]; }
// ์ฌ์ฉ๋ฌธ import useSnackbar from "@/hooks/useSnackbar"; function Main(){ const [showSnackbar, activateSnackbar, Snackbar] = useSnackbar("์๊ฐํ์ ์ถ๊ฐ๋์์ต๋๋ค."); // Snackbar ๋ด๋ถ ์ปจํ ์ธ return ( {isActive && <Snackbar/> } ) }
์ค๋ต๋ฐ ์ปดํฌ๋ํธ์ ์ด๋ฅผ ์กฐ์ํ๋ ํจ์๋ฅผ useSnackbar ํ ์ ์์งํ์ฌ ์ปค์คํ ํ ์ ์์ฑํ์๋ค. ์ค๋ต๋ฐ๋ฅผ ์กฐ์ํ ๋ ์ฌ์ฉํ๋ ๋ค์์ ๊ฐ๋จํ ์ธํฐํ์ด์ค๋ง์ ์ ๊ณตํ๊ณ ,
- ์ค๋ต๋ฐ ๋ ๋๋ง ์ฌ๋ถ๋ฅผ ํ๋จํ๋ ์ํ๊ฐ: showSnackbar
- ์ค๋ต๋ฐ๋ฅผ ๋ณด์ฌ์ค ์์ ์ ํธ์ถํ ํจ์: activateSnackbar
- ๋์ ์ผ๋ก ์ ๋ฌํ content๋ฅผ ๋ด์ ์ค๋ต๋ฐ ์ปดํฌ๋ํธ๋ฅผ ๋ฐํํ๋ ํจ์: Snackbar์ค๋ต๋ฐ๊ฐ ๋ง์ดํธ ๋ ์์ ์ผ๋ก๋ถํฐ 3์ด ํ ์ธ๋ง์ดํธ๋๋ ๋ณต์กํ ๋ก์ง์ ์จ๊ฒจ์ง ์ถ์ํ/์บก์ํ ๋ ์ฝ๋๊ฐ ์์ฑ๋์๋ค!
๐ ์ ๋ฆฌ
๋๊ตฐ๊ฐ๋ ์ด๋ฏธ ํด๋ณด์๋ ๊ณ ๋ฏผ์ผ ์๋, ์ ์ฉํ๊ณ ์๋ ๋ฐฉ๋ฒ์ผ ์๋ ์์ง๋ง...
๊ฐ์ ๊ณ ๋ฏผ์ ํ๋ ๋ถ๋ค์๊ฒ ๊ฝค๋ ์ ์ฉํ๊ฒ ์ธ ์ ์๋ ํจํด์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค!
(๋ค๋ฅธ chakra ui๊ฐ ์ง์ํ๋ ์ ํธ๋ฆฌํฐ ํ ๊ณผ ํจ๊ป ์ฌ์ฉํด ๋ณธ ์์ ์ ๋๋น https://github.com/Plan-A-project/Plan-A-client/issues/37)
๐ 2024-03-08
ํ์ฌ ์์ ์์ ํฌ์คํ ๋ฐฉ์์ฒ๋ผ ์ปดํฌ๋ํธ ์์ฒด๋ฅผ ์ปค์คํ ํ ์์ ๋ฐํํ๊ฒ ํ๋ ๋ฐฉ์์ ์ฌ๋ฌ ์ด์๊ฐ ๋ฐ์ํ์์ต๋๋ค.
1. ์ปค์คํ ํ ๊ณผ ์ธ๋ถ ์ปดํฌ๋ํธ์ ๊ฒฐํฉ๋๊ฐ ๋๋ฌด ๋์, ์ ์ฌํ ๋ก์ง์ ์ปค์คํ ํ ์๋ ๋์์ธ์ด ๋ค๋ฅธ ์ปดํฌ๋ํธ ๋ณ ๋ณ๋์ ์ปค์คํ ํ ์ ๋ง๋ค์ด์ผํ๋ ์ด์.
2. ์ปค์คํ ํ ๋ด๋ถ์ ์ผ๋ก ์ ์ธํ ์ํ๊ฐ(A)์ด ์๊ณ , ์ปค์คํ ํ ์ด ๋ฐํํ๋ ์ปดํฌ๋ํธ(B)๊ฐ ๊ทธ ์ํ๊ฐ(A)์ ์ธ์๋ก ๋ฐ๋๋ค๋ฉด, A๊ฐ ๋ณ๊ฒฝ๋ ๋, ์ปค์คํ ํ ์ ์ฌ์ฉํ๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ & A๋ฅผ ์ธ์๋ก ๋ฐ๋ B์ ๋ฆฌ๋ ๋๋ง์ด ์ค๋ณตํ์ฌ ๋ฐ์ํ๋ ์ด์.
์ ์ด์ ๋ก ํ์ฌ๋ HOC ํจํด์ ์ ์ฉํ ์ปค์คํ ํ ์ปดํฌ๋ํธ ๋ฐํ ๋ฐฉ์์ ๋์ด์ ์ฑํํ์ง ์์ ์ฑ, ์ปดํฌ๋ํธ์ ์ปค์คํ ํ ์ ์ ์ธ๋ฌธ์ ๋ถ๋ฆฌํ๊ณ , ์ปค์คํ ํ ์ด ๋ฐํํ props๋ฅผ ์ปดํฌ๋ํธ์ ์ ๋ฌํ๋ ๋ฐฉ์์ ์ฑํํ๊ฒ ๋์์ต๋๋ค.
์ถํ ๊ธฐํ๊ฐ ๋๋ค๋ฉด ์์ ์ ํจ๊ป ์ ๋ฆฌํด ๋ณด๊ฒ ์ต๋๋ค.
(์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๊พธ๋ฒ )์ฐธ์กฐ
*https://www.patterns.dev/posts/provider-pattern*
*https://patterns-dev-kr.github.io/design-patterns/hoc-pattern/*
https://biggwang.github.io/2019/06/28/Design Patterns/[Design Patterns] ํฉํ ๋ฆฌ ํจํด, ๋๋์ฒด ์ ์ฐ๋๊ฑฐ์ผ-๊ธฐ๋ณธ ์ด๋ก ํธ/
'๐ JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฆฌ์กํธ ์ ์ ํ์ด์ง ๋ฐฐํฌ ์๋ก ๊ณ ์นจ 404 ์ค๋ฅ (0) 2023.08.13 ์ฐ๋ฆฐ ์ด๋ป๊ฒ โabcโ์ toUpperCase๋ฅผ ์ฌ์ฉํ ์ ์์๊น? (0) 2023.02.28 ํจ์.prototype.bind(๊ฐ) vs ()โ{ํจ์(๊ฐ)} (+this์ ํ์ดํํจ์) (0) 2023.02.20 var ์ด๋ ์ธ ์ ๋ ์๊ฒ ๋๋ฐ? (1) 2023.02.18 ์ ํํ ๋ง๊ณ ๋ง์ ๋ฒ์ ์ค ES6 ์ผ๊น? (2) 2023.02.18