TypeScript

useMediaQuery — Responsive Hook

admin by @admin ADMIN
4m ago
May 31, 2026
Public
0 0 up · 0 down Sign in to vote
Subscribe to a CSS media query (e.g. dark mode, viewport size) from React. Re-renders when the match changes. SSR-safe — returns `false` on the server.
TypeScript
Raw
import { useEffect, useState } from 'react';

export function useMediaQuery(query: string): boolean {
  const [matches, setMatches] = useState(() => {
    if (typeof window === 'undefined') return false;
    return window.matchMedia(query).matches;
  });

  useEffect(() => {
    const mql = window.matchMedia(query);
    const onChange = (e: MediaQueryListEvent) => setMatches(e.matches);
    setMatches(mql.matches);                  // sync on mount
    mql.addEventListener('change', onChange);
    return () => mql.removeEventListener('change', onChange);
  }, [query]);

  return matches;
}

// Usage:
function App() {
  const prefersDark = useMediaQuery('(prefers-color-scheme: dark)');
  const isWide      = useMediaQuery('(min-width: 768px)');
  return <div className={prefersDark ? 'dark' : 'light'}>{isWide ? 'wide' : 'narrow'}</div>;
}
Tags

Save your own code snippets

Create a free account and build your private vault. Share publicly whenever you want.