๐Ÿ‹ 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] ํŒฉํ† ๋ฆฌ ํŒจํ„ด, ๋„๋Œ€์ฒด ์™œ ์“ฐ๋Š”๊ฑฐ์•ผ-๊ธฐ๋ณธ ์ด๋ก ํŽธ/

๋Œ“๊ธ€์ˆ˜0