React hook to track CSS media query matches for responsive design.
import { useState, useEffect } from 'react';
export function useMediaQuery(query: string): boolean {
const [matches, setMatches] = useState(false);
useEffect(() => {
const media = window.matchMedia(query);
// Set initial value
if (media.matches !== matches) {
setMatches(media.matches);
}
// Create listener
const listener = (event: MediaQueryListEvent) => {
setMatches(event.matches);
};
// Modern browsers
if (media.addEventListener) {
media.addEventListener('change', listener);
return () => media.removeEventListener('change', listener);
} else {
// Fallback for older browsers
media.addListener(listener);
return () => media.removeListener(listener);
}
}, [matches, query]);
return matches;
}Media queries are essential for responsive design. This hook allows you to use media queries directly in React components, enabling conditional rendering based on screen size or other media features.
import { useState, useEffect } from 'react';
export function useMediaQuery(query: string): boolean {
const [matches, setMatches] = useState(false);
useEffect(() => {
const media = window.matchMedia(query);
// Set initial value
if (media.matches !== matches) {
setMatches(media.matches);
}
// Create listener
const listener = (event: MediaQueryListEvent) => {
setMatches(event.matches);
};
// Modern browsers
if (media.addEventListener) {
media.addEventListener('change', listener);
return () => media.removeEventListener('change', listener);
} else {
// Fallback for older browsers
media.addListener(listener);
return () => media.removeListener(listener);
}
}, [matches, query]);
return matches;
}
window.matchMedia to check if a media query matches.function ResponsiveComponent() {
const isMobile = useMediaQuery('(max-width: 768px)');
const isTablet = useMediaQuery('(min-width: 769px) and (max-width: 1024px)');
const prefersDark = useMediaQuery('(prefers-color-scheme: dark)');
return (
<div>
{isMobile && <MobileView />}
{isTablet && <TabletView />}
{prefersDark && <DarkModeStyles />}
</div>
);
}
function useBreakpoints() {
const isSm = useMediaQuery('(min-width: 640px)');
const isMd = useMediaQuery('(min-width: 768px)');
const isLg = useMediaQuery('(min-width: 1024px)');
const isXl = useMediaQuery('(min-width: 1280px)');
return { isSm, isMd, isLg, isXl };
}
function ThemeAwareComponent() {
const prefersDark = useMediaQuery('(prefers-color-scheme: dark)');
return (
<div className={prefersDark ? 'dark-theme' : 'light-theme'}>
Content adapts to system theme
</div>
);
}
useWindowSize for simple breakpoint checks.false until hydration.A powerful hook that brings CSS media queries into your React components, enabling true responsive behavior.