์ปค์คํ ํ ๊ณผ ํจ๊ป ์ปดํฌ๋ํธ์ ๊ทธ ์กฐ์ ๋ก์ง์ ์ถ์ํํด๋ณด์!
๐ ๋ฐฐ๊ฒฝ
์๋ ์ด๋ฏธ์ง์ ๊ฐ์ด ์ฝํ ์ธ ๋ฅผ ๋์ ์ผ๋ก ๋ฐ๊ฟ ์ ์๊ณ & ๋ณด์ฌ์ฃผ๋ ์์ ์ผ๋ก๋ถํฐ 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] ํฉํ ๋ฆฌ ํจํด, ๋๋์ฒด ์ ์ฐ๋๊ฑฐ์ผ-๊ธฐ๋ณธ ์ด๋ก ํธ/