๋ฐ๋ก ์ง์ ํฌ์คํ ์์ antd ๊ทธ๋ฆฌ๋๋ฅผ ์ด์ฉํด์ ๋ธ๋ผ์ฐ์ ํ๋ฉด ์ฌ์ด์ฆ์ ๋ฐ๋ผ ๋ฐ์ํ๋ ํ์ด์ง๋ฅผ ๋ง๋ค์ด ๋ณด์๋ค. ์ ํํ 768px์ ๋ฐ๋๋์ง ๋ณด๋ ค๊ณ ํ์ฌ ํ๋ฉด์ ๋๋น๋ฅผ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ์ ๋์์ฃผ๋ ค๊ณ ํ๋ค.
1. resize ์ด๋ฒคํธ
resize ์ด๋ฒคํธ๋ document view์ ํฌ๊ธฐ๊ฐ ๋ณ๊ฒฝ๋ ๋ ๋ฐ์ํ๋ค. ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๋ง๋ค width
state์ ๋ธ๋ผ์ฐ์ ์ ๋๋น๊ฐ ์ ์ฅ๋๋๋ก ํ๋ค. useEffect
๋ฅผ ์ด์ฉํด์ ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ๋ ๋ ํด๋น ํจ์๋ฅผ ์คํํ๋ค.
const [width, setWidth] = useState(window.innerWidth);
const handleResize = () => {
setWidth(window.innerWidth);
};
useEffect(() => {
window.addEventListener("resize", handleResize);
return () => {
// cleanup
window.removeEventListener("resize", handleResize);
};
}, []);
useEffect
์ deps
์ ๋น ๋ฐฐ์ด์ ์ ๋ฌํ๋ฉด ์ปดํฌ๋ํธ๊ฐ ์ธ๋ง์ดํธ ๋ ๋ cleanup ํจ์๋ฅผ ์คํํ๋ค. ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ด๋ฒคํธ๋ฅผ ๊ผญ ์ ๊ฑฐํด์ค๋ค. width
state์ ๊ฐ์ด ๋ฐ๋ ๋๋ง๋ค ์ปดํฌ๋ํธ๊ฐ ์๋ก ๋ ๋๋ง๋์ด์ ๋ณด์ฌ์ง๋ค.
2. Throttle
1px์ด๋ผ๋ ๋ธ๋ผ์ฐ์ ์ ๋๋น๊ฐ ๋ฌ๋ผ์ง๋ฉด ๊ฐ์งํด์ ์ปดํฌ๋ํธ๋ฅผ ์๋ก ๋ ๋๋งํ๋ค. ์ด๋ ๊ฒ ๋ถํ์ํ ์์
์ ์ค์ด๊ธฐ ์ํด throttle๋ก ํจ์์ ํธ์ถ ํ์๋ฅผ ์กฐ์ ํ ์ ์๋ค. throttle์ ์ฌ๋ฌ๋ฒ ์ฐ์ํด์ ์๊ธฐ๋ ์ด๋ฒคํธ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ํ๋ฒ์ฉ๋ง ๋ฐ์ํ๋๋ก ํ๋ ๊ธฐ์ ์ด๋ค. npm์์ lodash
๋ฅผ ์ค์นํ๊ณ throttle
์ import ํด์จ ํ์ ์ฌ์ฉํ๋ค.
const handleResize = throttle(() => {
setWidth(window.innerWidth);
}, 200);
handleResize
๊ฐ ์ฐ์์ผ๋ก ํธ์ถ๋์ด๋ 0.2์ด๋ง๋ค ํ๋ฒ์ฉ๋ง ์คํ๋๋ค.
3. Debounce
debounce๋ throttle๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด๋ฒคํธ ํธ์ถ์ ์ ์ดํ๋ ๊ธฐ์ ์ด์ง๋ง ์ฝ๊ฐ ๋ค๋ฅด๋ค. ์ฐ์ํด์ ํธ์ถ๋๋ ํจ์ ์ค์์ ๋ง์ง๋ง์ผ๋ก ํธ์ถ๋ ๊ฒ๋ง ์คํ์ํจ๋ค.
๋๊ฐ์ด lodash
์์ debounce
๋ฅผ import ํด์จ ํ์์ฌ์ฉํ๋ค.
const handleResize = debounce(() => {
setWidth(window.innerWidth);
}, 200);
๋งค ์ ๋ ฅ์ด ๋๋ 200ms ๋์ ๋์ผํ ์ด๋ฒคํธ๊ฐ ๊ณ์ํด์ ๋ฐ์ ํ๋ค๋ฉด ์ ๋ ฅ์ด ๋๋ ๋๊ฐ์ฅ ๋ง์ง๋ง ์ด๋ฒคํธ๋ง์ ์คํํ๋ค.
๊ฒ์์ฐฝ์ ํ์ ํ์ ์ ๋ ฅํ ๋๋ง๋ค api ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ ๋ง์๋, ์ฌ์ฉ์๊ฐ ์ค์๋ก ์์ฒญ์ ๋ณด๋ด๋ ๋ฒํผ์ ๋์ธ๋ฒ ๋๋ ์ ๋ ๋ฑ, ํ๋ก ํธ๋จ์์ ์๋ฒ๋ก api ์์ฒญ์ ์ฐ์์ ์ผ๋ก ๋ณด๋ด๋๊ฒ์ ๋ฐฉ์งํ ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.