snippet · 2026-06-24 · 3 min

An accessible useMediaQuery hook

A client hook that listens to system preferences without leaking event listeners.

  • react
  • accessibility
  • hooks

The hook

import { useEffect, useState } from "react";
 
export function useMediaQuery(query: string) {
  const [matches, setMatches] = useState(false);
 
  useEffect(() => {
    const media = window.matchMedia(query);
    const update = () => setMatches(media.matches);
    update();
    media.addEventListener("change", update);
    return () => media.removeEventListener("change", update);
  }, [query]);
 
  return matches;
}

For content that must be correct before hydration, prefer CSS media queries or a server-safe default. A hook is useful when behavior—not only presentation—must respond to prefers-reduced-motion, contrast, or layout conditions.