логотип PurpleSchool
логотип PurpleSchool

Как использовать Nuxt Link для навигации

Автор

Олег Марков

Введение

Nuxt Link — это ключевой компонент во всех проектах на Nuxt, который обеспечивает навигацию между страницами без перезагрузки. Такой подход называется клиентской навигацией (SPA-навигация) и позволяет приложениям быть отзывчивыми, быстрыми и современными. Используя Nuxt Link, вы легко реализуете единый стиль перехода между страницами, сможете передавать параметры, работать с дополнительными настройками навигации и создавать доступные интерфейсы.

Давайте вместе разберёмся, как пользоваться Nuxt Link для базовой и продвинутой навигации в Nuxt-проектах. Я покажу вам примеры кода, объясню, как работают параметры, метки, динамические маршруты, а также расскажу, как сделать ваши ссылки ещё удобнее для пользователей.

В первую очередь, Nuxt Link — это компонент, предназначенный для создания внутренних ссылок. Он оборачивает <a>-тег и сам обрабатывает логику навигации, используя встроенный роутер Nuxt (который основан на Vue Router). Это значит: вы используете Nuxt Link для перехода между страницами, определёнными в директории pages вашего проекта.

Давайте разберёмся на простом примере:

<template>
  <NuxtLink to="/about">
    Перейти на страницу "О нас"
  </NuxtLink>
</template>

Этот код создаёт ссылку на страницу /about. Nuxt Link автоматически обработает клик, чтобы не было полной перезагрузки страницы.

Nuxt Link — это важный компонент для создания навигации в Nuxt-приложении. Он обеспечивает плавные переходы между страницами и улучшает пользовательский опыт. Умение использовать Nuxt Link — это базовый навык для любого Nuxt-разработчика. Если вы хотите детальнее погрузиться в мир Nuxt, освоить все его тонкости и стать настоящим профессионалом — приходите на наш большой курс Nuxt - fullstack Vue фреймворк. На курсе 129 уроков и 13 упражнений, AI-тренажеры для безлимитной практики с кодом и задачами 24/7, решение задач с живым ревью наставника, еженедельные встречи с менторами.

Отличие от обычного <a>

Вы могли бы написать просто <a href="/about">, но в таком случае произойдёт полная загрузка страницы — потеряется состояние SPA (Single Page Application). Nuxt Link решает эту проблему.

Давайте посмотрим, какие параметры вы можете использовать с компонентом Nuxt Link.

Параметр to

Это обязательный параметр — он указывает, куда должна вести ссылка. Обычно это строка с маршрутом.

<NuxtLink to="/contact">
  Контактная страница
</NuxtLink>

Объектный синтаксис для передачи параметров

Если вы хотите передавать параметры или использовать именованные маршруты, используйте объект:

<NuxtLink
  :to="{
    name: 'user-id', // имя маршрута из pages/user/_id.vue
    params: { id: 42 }
  }"
>
  Профиль пользователя с id 42
</NuxtLink>

Это позволяет более гибко формировать путь и исключает ручную склейку url.

Параметр custom

Nuxt позволяет рендерить ссылку по вашему шаблону через scoped slots, используя параметр custom. Это полезно для стилизации кнопок или других интерактивных элементов.

<NuxtLink to="/dashboard" custom v-slot="{ navigate, href, isActive }">
  <button :class="{ active: isActive }" @click="navigate">
    Войти в личный кабинет
  </button>
</NuxtLink>

Здесь вы управляете внешним видом и поведением через свои элементы, но при этом получаете все плюсы Nuxt Link.

Параметр replace

Если вы хотите, чтобы переход заменял текущий адрес в истории браузера (как window.location.replace), используйте параметр replace:

<NuxtLink to="/logout" replace>
  Выйти
</NuxtLink>

Такой переход не создаёт новую запись в истории браузера.

Параметр prefetch

По умолчанию Nuxt Link автоматически предварительно подгружает страницу, на которую указывает ссылка, когда эта ссылка появляется в области видимости пользователя (lazy prefetch). Можно отключить это поведение:

<NuxtLink to="/blog" :prefetch="false">
  Статьи блога без предзагрузки
</NuxtLink>

Это уменьшает потребление трафика, если нужно.

Использование с динамическими маршрутами

Если вы используете динамические страницы (например, pages/post/_id.vue), Nuxt Link позволяет удобно указывать параметры:

<NuxtLink :to="{ name: 'post-id', params: { id: post.id } }">
  {{ post.title }}
</NuxtLink>

Имя маршрута включает структуру папки — например, для pages/post/_id.vue имя будет 'post-id'.

Добавление query-параметров

Часто бывает нужно добавить к ссылке параметры запроса:

<NuxtLink :to="{ path: '/search', query: { q: 'nuxt', page: 2 } }">
  Поиск по Nuxt (стр. 2)
</NuxtLink>

Результирующий url будет выглядеть так: /search?q=nuxt&page=2.

Навигация по якорям

Если вы используете якоря для плавного перехода по странице, Nuxt Link подерживает и это:

<NuxtLink to="#features">
  Подробнее о возможностях
</NuxtLink>

Стилизация активных ссылок

Nuxt Link автоматически добавляет CSS-класс router-link-active для активных ссылок и router-link-exact-active, если путь полностью совпадает. Вы можете использовать это в стилях:

.router-link-active {
  color: #42b983;
  font-weight: bold;
}

Это удобно для подсветки текущей страницы или раздела меню.

Передача состояния через навигацию

Иногда нужно передать дополнительную информацию при переходе. Вы можете воспользоваться state, который попадёт в history.state, но Nuxt Link по умолчанию это не поддерживает из коробки в отличие от некоторых решений (например, React Router). В этом случае распространён практический подход — добавлять параметры в query или params.

Если у вас есть массив данных, легко отрисовать список ссылок на основе данных:

<template>
  <ul>
    <li v-for="item in items" :key="item.id">
      <NuxtLink :to="{ name: 'item-id', params: { id: item.id } }">
        {{ item.name }}
      </NuxtLink>
    </li>
  </ul>
</template>

Это делает динамические меню и списки предельно простыми.

Совместимость с SSR и SPA

Nuxt Link работает одинаково хорошо как в серверном рендеринге, так и в SPA-режиме. Если ваша страница была отрендерена на сервере, то при первом же клике Nuxt Link переключает приложение в SPA-режим.

Доступность

Nuxt Link всегда рендерит тег <a>, что обеспечивает соответствие стандартам доступности. Вы легко добавите атрибуты aria-* или tabindex:

<NuxtLink to="/profile" aria-label="Открыть профиль" tabindex="0">
  Профиль
</NuxtLink>

Обработка событий

Иногда нужна обработка события клика по ссылке, например, закрыть выпадающее меню или отправить аналитику. Можно добавить обработчик:

<NuxtLink to="/about" @click.native="handleMenuClose">
  О компании
</NuxtLink>

Обратите внимание: во Vue 3 уже не требуется .native, достаточно просто @click.

Ограничение предзагрузки для оптимизации

Если у вас на странице много ссылок и вы хотите вручную управлять, какие из них требуют префетча, используйте параметр prefetch:

<NuxtLink to="/heavy-page" :prefetch="false">
  Не подгружать тяжёлую страницу заранее
</NuxtLink>

Использование с внешними ссылками

Nuxt Link предназначен только для внутренних переходов. Внешние ссылки (на другой домен) делайте классическим <a href="http://site.com" target="_blank" rel="noopener">.

Если вам надо создать сложные ссылки с вложенными элементами, вы можете использовать slot:

<NuxtLink to="/news/2024">
  <strong>Все новости 2024 года</strong>
  <span class="arrow">→</span>
</NuxtLink>

Внутри ссылки вы размещаете любой HTML.

Использование scrollBehavior для плавной прокрутки

Nuxt поддерживает scrollBehavior настройку глобального роутера. Когда вы переходите по Nuxt Link, страница будет вести себя согласно scrollBehavior, например, сохранять положение страницы или скроллить к якорю.

Вы можете настроить это в nuxt.config.js:

export default {
  router: {
    scrollBehavior(to, from, savedPosition) {
      if (savedPosition) {
        return savedPosition // если это нажатие "назад"
      } else if (to.hash) {
        return {
          selector: to.hash, // скроллит к якорю
          behavior: 'smooth'
        }
      } else {
        return { x: 0, y: 0 }
      }
    }
  }
}

Заключение

Nuxt Link — базовый инструмент для организации навигации в Nuxt-проектах. Используйте его для создания интуитивно понятных, быстрых и удобных интерфейсов. Он помогает избежать полной перезагрузки страницы, поддерживает передачу параметров, легко настраивается для разных ситуаций и автоматизирует многие рутинные детали. Освоив Nuxt Link, вы сможете применять его как в простых задачах (меню, ссылки, кнопки переходов), так и в сложных сценариях, например, с динамическими маршрутами, передачей query-параметров или реализацией своего шаблона ссылок.

Использование Nuxt Link — это лишь один из аспектов создания навигации в Nuxt-приложении. Чтобы создавать сложные и удобные системы навигации, необходимо также освоить другие навыки, такие как работа с роутингом, параметрами маршрутов и динамическими маршрутами. На курсе Nuxt - fullstack Vue фреймворк вы получите комплексные знания и практический опыт, необходимые для создания профессиональных систем навигации в Nuxt-приложениях. В первых 3 модулях уже доступно бесплатное содержание — начните погружаться в мир Nuxt прямо сегодня.

Частозадаваемые технические вопросы по теме статьи

Используйте to="/":

<NuxtLink to="/">
  На главную
</NuxtLink>

Если у страницы сложная структура маршрута, указывайте имя маршрута:

<NuxtLink :to="{ name: 'index' }">
  Главная
</NuxtLink>

Вызовите метод $router.push внутри метода компонента:

this.$router.push({ name: 'profile', params: { id: 123 } })

Nuxt Link не поддерживает открытие внутренней страницы в новой вкладке по параметру. Используйте обычный <a> с определением маршрута через $route или используйте модификатор ctrl/cmd + click, который поддерживается браузером.

<NuxtLink to="/news" target="_blank">Новости</NuxtLink>
<!-- target="_blank" не работает с Nuxt Link корректно; используйте <a>. -->

Как узнать имя маршрута для передачи в параметре name?

Имя маршрута формируется из структуры папок и файлов в директории pages. Например, файл pages/posts/_slug.vue будет иметь имя маршрута 'posts-slug'. Можно узнать список маршрутов, запустив команду nuxi dev и посмотрев структуру в консоли при запуске.

Почему не работает active класс на ссылке?

Проверьте, что путь, переданный в Nuxt Link, точно совпадает с текущим url. Класс router-link-active добавляется при совпадении маршрутов, включая вложенные пути. Если нужна точная активность, используйте exact на ссылке:

<NuxtLink to="/" exact>
  Главная
</NuxtLink>
Стрелочка влевоНастройка индикатора загрузки в NuxtКак оптимизировать изображения в Nuxt приложенииСтрелочка вправо

Постройте личный план изучения Nuxt до уровня Middle — бесплатно!

Nuxt — часть карты развития Frontend

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Бесплатные лекции

Все гайды по Nuxt

Генерация статического сайта с помощью NuxtКак использовать useAsyncData в NuxtКак использовать SVG в NuxtКоманды для запуска NuxtРабота с JSON-данными в NuxtКак настроить HTML-шаблон в NuxtГенерация статического сайта с помощью NuxtРуководство по получению данных с Fetch в NuxtКак отключить определенные функции в NuxtРабота с данными в Nuxt с помощью useNuxtDataНастройка и использование cookie в NuxtГайд по аутентификации (auth) в NuxtКак создавать API-маршруты в Nuxt
Использование Vite для ускорения разработки в NuxtРуководство по использованию TypeScript в NuxtКак запустить Nuxt-приложение в productionКак работает Server-Side Rendering SSR в NuxtНастройка и оптимизация серверной части Nuxt-приложенияРуководство по настройке маршрутизации в NuxtКакие проекты разумно реализовывать на NuxtИнструкция по управлению пакетами NPM в NuxtИнтеграция Node.js для Nuxt-приложенияНастройка мета-тегов для SEO в NuxtНастройка и использование HTTPS в NuxtКак отлавливать и обрабатывать ошибки в NuxtКак развернуть Nuxt приложение в DockerРуководство по развертыванию приложений в Nuxt CloudКак оптимизировать сборку на NuxtИнтеграция Laravel и Nuxt
Открыть базу знаний

Лучшие курсы по теме

Иконка ракетыСкоро!
изображение курса

Nuxt

Антон Ларичев
изображение курса

TypeScript с нуля

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Next.js - с нуля

Антон Ларичев
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее

Отправить комментарий