Window Resize에 따른 메뉴상태관리

xohxe (김소혜)· October 25, 2023
gatsby 블로그에서 화면 사이즈에 따라 사이드메뉴 useState를 구현해보면서,
개인적으로 정말 자주 쓸 것 같아 정리해봤다.
살짝 복잡하지만 하나하나 살펴보자.
구현 목표
- 모바일 화면에서는 사이드바의 default state는 오픈되지 않은 상태여야 함.
- PC 화면에서는 사이드바 default state는 open이어야함
- 페이지 로드시와 window 크기가 변화함에 따라, menu open 상태를 변화시켜야함.
- 메뉴 open 버튼에 따라 open/close를 변경되어야함.
체크해야할 사항
resize, useState , useEffect , SSR
해결코드
if (typeof window === "undefined" || !window.document) {
return;
}
if (!document.body) return 0;
const [menuOpen, setMenuOpen] = useState(window.innerWidth > 800);
const [isMobile, setIsMobile] = useState(window.innerWidth < 800);
useEffect(() => {
const handleResize = () => {
if (window.innerWidth < 800) {
setIsMobile(true);
setMenuOpen(!menuOpen);
} else {
setIsMobile(false);
setMenuOpen(menuOpen);
}
};
window.addEventListener("resize", handleResize);
return () => {
window.removeEventListener("resize", handleResize);
};
}, []);
const toggleMenu = () => {
setMenuOpen(!menuOpen);
};
return (
<>
<div>
{isMobile ? (
<>
{menuOpen && (
<>
<Sidebar sidebar="sidebar-md" />
<div className="sidebar-overlay" onClick={toggleMenu}></div>
</>
)}
</>
) : (
<>{menuOpen && <Sidebar sidebar="sidebar-lg" />}</>
);
}
</div>
</>
);다음 게시물
Gatsby Head API로 메타태그를 적용해보자.(ogImage)이전 게시물
React에서 클립보드 복사 기능 구현하기