-
[Next.js] useMediaQuery 모바일/데스크탑 구분 훅 (feat. window is not defined)FrontEnd/Next.js 2024. 9. 23. 10:53
window.matchMedia를 사용하여 미디어 쿼리 변경을 감지하고 이벤트 리스너를 추가
matchMedia 객체를 통해 매개변수로 넘어온 query에 맞춰 매치가 되는지 true false 반환
현재 기본 값으로 최대가 768px인지를 판단하는 쿼리가 들어왔으므로
모바일이라면 true, 데스크탑이라면 false를 반환해준다.
import { useState, useEffect } from "react"; export function useMediaQuery(query: string = "(max-width: 768px)"): boolean { const [matches, setMatches] = useState<boolean>(false); useEffect(() => { const getMatches = (query: string): boolean => { // window is not defined가 뜨는 ssr 이슈 막기 if (typeof window !== "undefined") { return window.matchMedia(query).matches; } return false; }; function handleChange() { setMatches(getMatches(query)); } // 초기값 세팅 handleChange(); const matchMedia = window.matchMedia(query); matchMedia.addEventListener("change", handleChange); // 클린업 시 이벤트 삭제 return () => { matchMedia.removeEventListener("change", handleChange); }; }, [query]); return matches; }
'FrontEnd > Next.js' 카테고리의 다른 글
[Next.js] supabase auth를 통해 next 프로젝트에 oauth 접목 시키기 (feat. Multiple GoTrueClient instances detected in the same browser context 에러) (3) 2024.10.04 cloudinary API를 통해 이미지 업로드 해보기 (feat. Next.js) (0) 2024.09.06 Credetials callback function handle error (next-auth v5) (0) 2024.06.17 form에서 server action 다루기 (0) 2024.06.15 Form에서 두개 이상의 버튼을 다루기 (feat. server action ) (1) 2024.06.14