Навигация: Link и useRouter

Переходим между страницами мгновенно, без полной перезагрузки браузера.

Link — компонент Next.js для переходов между маршрутами на стороне клиента: он не перезагружает страницу и заранее подгружает целевой маршрут.

Почему не обычный <a>

Обычная ссылка <a href> заставляет браузер заново скачать и отрисовать всю страницу — теряется состояние, мигает экран. Link делает клиентский переход: меняется только нужная часть, layout сохраняется, а целевой маршрут предзагружается, пока ссылка видна на экране.

import Link from "next/link";

export default function Nav() {
  return (
    <nav>
      <Link href="/">Главная</Link>
      <Link href="/about">О нас</Link>
      <Link href="/blog/nextjs">Статья</Link>
    </nav>
  );
}

Программная навигация: useRouter

Иногда нужно перейти не по клику на ссылку, а после действия — например, отправки формы. Тогда используют хук useRouter. Важно: он работает только в клиентском компоненте, поэтому в начале файла ставят 'use client':

"use client";
import { useRouter } from "next/navigation";

export default function LoginButton() {
  const router = useRouter();

  function handleClick() {
    // ...какая-то логика...
    router.push("/dashboard");
  }

  return <button onClick={handleClick}>Войти</button>;
}
МетодЧто делает
router.push("/x")Перейти на /x, добавив запись в историю
router.replace("/x")Перейти, заменив текущую запись истории
router.back()Вернуться назад
router.refresh()Перезапросить данные текущего маршрута

Важная деталь импорта

В App Router useRouter импортируют из next/navigation, а не из next/router (это устаревший путь для Pages Router). Перепутать — частая ошибка, дающая невнятную ошибку времени выполнения.

Итог

  • Для ссылок используйте Link — клиентский переход без перезагрузки и с предзагрузкой.
  • Для переходов из кода — useRouter (только в клиентском компоненте с 'use client').
  • В App Router импорт — из next/navigation.
Проверьте себя
1. Чем Link лучше обычного тега <a> в Next.js?
ALink автоматически добавляет стили
BLink делает клиентский переход без полной перезагрузки и предзагружает маршрут
CLink работает только на сервере
DМежду ними нет разницы
2. Откуда в App Router импортируют useRouter?
Anext/router
Bnext/navigation
Creact-router-dom
Dnext/link
3. Какое условие обязательно для использования useRouter?
AКомпонент должен быть серверным
BФайл должен начинаться с 'use client'
CНужно обернуть компонент в Suspense
DНужен импорт из next/link
Поддержать проект