231024(ํ) ์ฑ์ฅ
๐ค ์ฑ์ฅ์ผ์ง 7.0
์ฑ
ํ๋ณตํ ์ด๊ธฐ์ฃผ์์(์จ์ธ ๋ค์ด์ด)
์ ๋ด์ฉ์ ์๊ทน๋ฐ์ ์์ํ๋ ์๋ฐํ ์ฑ์ฅ๊ธฐ๋ก
์ด์์๋ ๊ฝ๊ณผ ์ฃฝ์ ๊ฝ์ ์ด๋ป๊ฒ ๊ตฌ๋ณํ๋๊ฐ?
์ฑ์ฅํ๊ณ ์๋ ๊ฒ์ด ์ด์ ์๋ ๊ฒ์ด๋ค.
์๋ช ์ ์ ์ผํ ์ฆ๊ฑฐ๋ ์ฑ์ฅ์ด๋ค!
โ (7.0)<์์ ๊ฐํธ>
ํ์ธ๋ง ํ์ต๋ฒ
์ ์๊ฒ ๋๋งํผ, ์ฑ์ฅ์ผ์ง๋ ์ ๋ง ๊ทธ ๋ ์ ํค์๋ ์ค์ฌ์ผ๋ก ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํ๋๋ก ํ๋ค.
Toast ์ปดํฌ๋ํธ ๊ตฌํํ๊ธฐ
์ด์ง ์ ๋งคํ ๊ฐ์ด ์์ง๋ง, tailwindcss๋ฅผ ์ฌ์ฉํด์ Toast ์ปดํฌ๋ํธ๋ฅผ ๊ตฌํํด๋ณด์๋ค. ์ฐ์ ๋ธ๋ผ์ฐ์ ํ๋จ์์ ์๋ก ํ์ด๋์ค๋ ํ ์คํธ์ ๊ทธ ๋ฐ๋๋ก ์ด๋ํ๋ ํ ์คํธ๋ฅผ ๊ตฌํํ๊ณ ์ถ์๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ์ด tailwindcss config๋ฅผ ์ค์ ํ์๋ค.
import type { Config } from 'tailwindcss';
const config: Config = {
content: [
'./src/pages/**/*.{js,ts,jsx,tsx,mdx}',
'./src/components/**/*.{js,ts,jsx,tsx,mdx}',
'./src/app/**/*.{js,ts,jsx,tsx,mdx}',
],
theme: {
keyframes: {
slideUpFadeOut: {
'0%': { transform: 'translateY(0)', opacity: '100' },
'90%': { transform: 'translateY(-90%)', opacity: '100' },
'100%': { transform: 'translateY(-100%)', opacity: '0' },
},
slideDownFadeOut: {
'0%': { transform: 'translateY(-100%)', opacity: '100' },
'90%': { transform: 'translateY(-10%)', opacity: '100' },
'100%': { transform: 'translateY(0)', opacity: '0' },
},
},
animation: {
slideUpFadeOut: 'slideUpFadeOut 1s ease-in-out forwards',
slideDownFadeOut: 'slideDownFadeOut 1s ease-in-out forwards',
},
},
plugins: [],
};
export default config;
์ด๋ ๊ฒ๋ง ํ๋ฉด ์ฌ์ค ๊ฑฐ์ ๋์ด ๋ฌ๋ค. ์ด์ ๋ ํ ์คํธ ์ปดํฌ๋ํธ๋ฅผ ๊ตฌํํ๋ฉด ๋๋ค. ํ ์คํธ ์ปดํฌ๋ํธ๋ ์๋์ ๊ฐ์ด ๊ตฌํํ์๋ค.
type Props = {
children: React.ReactNode;
direction: 'up' | 'down';
};
export default function Toast({ children, direction = 'up' }: Props) {
if (direction === 'down') {
return (
<div className="fixed bottom-0 z-50 flex h-20 w-32 animate-slideDownFadeOut items-center justify-center rounded-lg bg-yellow">
<span className="text-xl font-bold leading-xl text-black_100">{children}</span>
</div>
);
}
return (
<div className="fixed bottom-0 z-50 flex h-20 w-32 animate-slideUpFadeOut items-center justify-center rounded-lg bg-blue">
<span className="text-xl font-bold leading-xl text-white_100">{children}</span>
</div>
);
}
props๋ก children๊ณผ direction์ ๋ฐ์์ ํ ์คํธ์ ๋ด์ฉ์ children์ผ๋ก ์ ๋ฌํ๊ณ ์์์ ๊ตฌํํ๋ ์ ๋๋ฉ์ด์ ์ค ํ๋๋ฅผ direction์ ๋ฐ๋ผ์ ์ ์ฉํ๋๋ก ํ์๋ค. ์ด์ ํ ์คํธ๋ฅผ ์ฌ์ฉํด๋ณด์.
export default function ToastMachine() {
const [upToast, setUpToast] = useState(false);
const [downToast, setDownToast] = useState(false);
return (
<>
{upToast && <Toast direction="up">์คํฌ๋ฉ ์๋ฃ!</Toast>}
{downToast && <Toast direction="down">์คํฌ๋ฉ ์ทจ์!</Toast>}
</>
);
}
์์ ๊ฐ์ด ๊ฐ๊ฐ์ ๋ฐฉํฅ์ ๋ง๋ ์ํ๋ฅผ ์ค์ ํด์ฃผ๊ณ ์ฌ์ฉํ๋ฉด ๋๋ค. ์ด ๋, ๊ฐ ํ ์คํธ์ ์ํ๋ ํน์ ์ด๋ฒคํธ์ ๋ฐ๋ผ์ ๋ณ๊ฒฝ๋๋๋ก ํ๋ฉด ๋๋ค. ex) ์ด๋ค ๋ฒํผ์ ํด๋ฆญํ์ ๋, ํ ์คํธ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ handler๋ฅผ ์ ๋ฌํ๋ฉด ๋๋ค.
๐ ํ๊ณ
ํ์โฆ ํ๋ก์ ํธ๋ฅผ ํ๋ ๋์ ์ฝ๋๋ ์๋ง์ด์ง๋งโฆ ๊ทธ๋๋ ์ด์ง์ ์ฐ ํ์ ๊ธฐ๋ฅ๊ณผ ๋ด๊ฐ ์ข๋ ์์ฌ ๋๋ ๋ถ๋ถ๋ค๊น์ง ๊ตฌํ์ ๋ง์น ์ ์์๋ค. ์๊ฐ๋ณด๋ค ํ๋ก์ ํธ ๊ธฐ๊ฐ ๋์ ๋ฐ๋ ์๋ฐ๊ฐ(?)์ด ์์ง ์์ ๊ฒ ๊ฐ๋ค. ์ผ์ฃผ์ผ์ ํ๋ฆฌ๋ฆญ ๋ณด๋ธ๋งํผ ๋ค์ ๊ณํ๋ถํฐ ์ฌ์ ๋นํ๊ณ ๋ด์ผ๋ถํฐ ๋ ์ด์ฌํ ๋ฌ๋ ค๋ด์ผ์ง.