Window Resize에 따른 메뉴상태관리

소혜 (Sohye)
xohxe (김소혜)· October 25, 2023

gatsby 블로그에서 화면 사이즈에 따라 사이드메뉴 useState를 구현해보면서,
개인적으로 정말 자주 쓸 것 같아 정리해봤다.

살짝 복잡하지만 하나하나 살펴보자.

구현 목표

  1. 모바일 화면에서는 사이드바의 default state는 오픈되지 않은 상태여야 함.
  2. PC 화면에서는 사이드바 default state는 open이어야함
  3. 페이지 로드시와 window 크기가 변화함에 따라, menu open 상태를 변화시켜야함.
  4. 메뉴 open 버튼에 따라 open/close를 변경되어야함.

체크해야할 사항

resize, useState , useEffect , SSR

해결코드

COPY
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에서 클립보드 복사 기능 구현하기

© 2023 - 2024 xohxe. All Rights Reserved.