Главная

Кастомный хук для работы с шириной экрана

Кастомный хук для работы с шириной экрана

Для того чтобы пофиксить window is not defined в next.js можно воспользоваться кастомным хуком:

import { useState, useCallback, useEffect } from 'react';

const useMediaQuery = (width) => {
  const [targetReached, setTargetReached] = useState(false);

  const updateTarget = useCallback((e) => {
    if (e.matches) {
      setTargetReached(true);
    } else {
      setTargetReached(false);
    }
  }, []);

  useEffect(() => {
    const media = window.matchMedia(`(max-width: ${width}px)`);
    media.addEventListener('change', (e) => updateTarget(e));

    if (media.matches) {
      setTargetReached(true);
    }

    return () => media.removeEventListener('change', (e) => updateTarget(e));
  }, []);

  return targetReached;
};

export default useMediaQuery;

Компонент header:

import useMediaQuery from '../../hooks/useMediaQuery';
import MobileMenu from '../mobile-menu/mobile-menu';
import HeaderNav from './header-nav';

function Header() {
  const isBreakpoint = useMediaQuery(768);

  return (
    <header>
      {isBreakpoint ? <MobileMenu /> : <HeaderNav />}
    </header>
  );
}

export default Header;