useMediaQuery — это хук, предоставляемый библиотекой MUI
(Material-UI), который позволяет реализовать адаптивный дизайн
компонентов на основе условий медиа-запросов. Он возвращает булево
значение, которое отражает, соответствует ли текущее состояние окна
заданному условию. Этот инструмент особенно полезен для изменения
структуры интерфейса и стилей в зависимости от ширины экрана, ориентации
устройства или других характеристик среды.
import { useMediaQuery } from '@mui/material';
Хук принимает в качестве аргумента строку медиа-запроса или функцию, возвращающую строку. Простейший пример:
const isLargeScreen = useMediaQuery('(min-width:1200px)');
В этом случае isLargeScreen будет true,
если ширина окна больше или равна 1200 пикселей.
Ключевой момент: строка медиа-запроса должна быть
валидной CSS-конструкцией, поддерживаемой в
window.matchMedia.
Для интеграции с темой MUI удобно использовать объект
theme и предопределенные брейкпоинты:
import { useTheme } from '@mui/material/styles';
const theme = useTheme();
const isMediumUp = useMediaQuery(theme.breakpoints.up('md'));
Здесь theme.breakpoints.up('md') соответствует условию,
когда ширина экрана равна или больше среднего брейкпоинта
(md).
Преимущества использования брейкпоинтов темы:
useMediaQuery автоматически реагирует на изменения
размера окна, что позволяет обновлять интерфейс без дополнительных
слушателей событий:
const isSmallScreen = useMediaQuery('(max-width:600px)');
return (
<div>
{isSmallScreen ? <MobileMenu /> : <DesktopMenu />}
</div>
);
В этом примере компонент меню меняется в зависимости от ширины окна,
без ручного контроля событий resize.
По умолчанию useMediaQuery использует серверный
рендеринг (SSR) как false. Для предотвращения различий
между сервером и клиентом можно передать опцию
ssrMatchMedia:
const isTablet = useMediaQuery(theme.breakpoints.between('sm', 'md'), {
noSsr: false,
});
Пояснение:
noSsr: true — хук не учитывает серверный
рендеринг.noSsr: false — используется для корректного рендеринга
на сервере, что важно для Next.js и других SSR-фреймворков.Можно передавать функцию, которая возвращает медиа-запрос, используя тему или другие динамические значения:
const isPortrait = useMediaQuery(theme => theme.breakpoints.down('sm'));
Такой подход полезен, если медиа-запрос зависит от переменной или вычисляется динамически, что делает хук более гибким для сложных условий интерфейса.
Для реализации сложной адаптивности можно объединять несколько
вызовов useMediaQuery:
const isMobile = useMediaQuery(theme.breakpoints.down('sm'));
const isLandscape = useMediaQuery('(orientation: landscape)');
return (
<div>
{isMobile && isLandscape ? <LandscapeMobileLayout /> : <DefaultLayout />}
</div>
);
Примечание: объединение нескольких условий через логические операторы позволяет создавать более точные правила отображения компонентов, учитывая различные сценарии устройств.
useMediaQuery является мощным инструментом для создания
адаптивных интерфейсов на React с MUI. Его использование вместе с темой
и брейкпоинтами обеспечивает гибкость, масштабируемость и соответствие
принципам Material Design. Поддержка SSR и динамических функций делает
его подходящим для любых современных приложений, включая проекты с
серверной генерацией.
Хорошая практика — комбинировать useMediaQuery с Grid,
Box и другими компонентами MUI для построения полностью адаптивных
макетов.