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

Использование router-link для навигации в Vue Router

Автор

Олег Марков

Введение

Навигация — одна из ключевых задач современных одностраничных приложений. Именно она задает логику перехода между страницами и определяет, как пользователь перемещается внутри проекта. Во Vue.js для этих целей чаще всего применяют Vue Router — официальный маршрутизатор фреймворка. Базовым инструментом для построения навигации в нем служит элемент router-link.

router-link — это не обычная ссылка из HTML. Она интегрирована с системой маршрутов, работает без перезагрузки страницы, корректно обновляет адресную строку и под капотом использует API истории браузера. В этой статье вы разберетесь, как использовать router-link на практике, познакомитесь с его свойствами, увидите различные сценарии его применения и получите ответы на частые вопросы о его работе.

Основные задачи и преимущества

Элемент router-link предназначен для создания ссылок, которые адаптируются под вашу конфигурацию маршрутов. Его использование гарантирует корректный переход между компонентами без перезагрузки страницы.

Преимущества router-link по сравнению с обычной ссылкой:

  • Интеграция с маршрутизатором — автоматически использует вашу конфигурацию маршрутов;
  • Без перезагрузки страницы — работает как SPA (Single Page Application);
  • Реактивность — ссылки автоматически отражают состояние активного маршрута;
  • Дополнительные возможности — задаете параметры, переходите программно, работает prefetching.

Теперь посмотрим, как этот инструмент применяется на практике.

Простейший пример использования

Вот минимальный пример router-link внутри компонента:

<template>
  <router-link to="/about">О проекте</router-link>
</template>

// Этот код создает ссылку, ведущую на путь "/about" // По клику компонент, связанный с этим маршрутом, отрисуется без перезагрузки страницы

Такой подход позволит пользователю плавно и почти незаметно для себя переходить между страницами приложения.

Свойство to — выбор маршрута

Самое важное свойство router-link — это to. Именно оно определяет, на какой путь будет вести ссылка.

Передача строки

Чаще всего to принимает строку пути:

<router-link to="/dashboard">Панель управления</router-link>

// При клике происходит переход на /dashboard

Использование объекта (route location object)

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

<router-link :to="{ name: 'user', params: { userId: 10 } }">Профиль</router-link>

// Здесь name ссылается на название маршрута из конфигурации Vue Router // params позволит подставить параметры прямо в путь, например /user/10

Обратите внимание, если вы используете параметры, необходимо чтобы путь маршрута содержал, например, "/user/:userId".

Динамическое вычисление значения to

router-link прекрасно работает с реактивными переменными и computed:

<script setup>
import { ref } from 'vue'

const userId = ref(15)
</script>

<template>
  <router-link :to="`/user/${userId}`">Мой профиль</router-link>
</template>

// userId может измениться, и ссылка всегда будет вести на актуальный путь

Такой подход очень удобен для динамической навигации.

Настройка внешнего вида и поведения

router-link позволяет настраивать как внешний вид, так и поведение ссылки.

tag — какой элемент рендерить

По умолчанию router-link отображается как тег <a>. Если вам нужно изменить его на любой другой тег (например, <li>), используйте пропс tag:

<router-link to="/contacts" tag="li">Контакты</router-link>

// Рендер будет через

  • , событие клика все равно останется на месте // Учтите, что начиная с Vue Router 4 данный пропс больше не поддерживается; используйте scoped slots

    scoped slot — кастомизация содержимого (Vue Router 4+)

    Теперь для управления вложенным содержимым используют слот с деструктуризацией:

    <router-link to="/news" v-slot="{ href, navigate, isActive, isExactActive }">
      <li :class="{ active: isActive }">
        <a :href="href" @click="navigate">Новости</a>
      </li>
    </router-link>

    // Такой подход дает полный контроль над рендерингом и стилем активной ссылки

    Кастомизация классов: active-class и exact-active-class

    Cоздавая навигацию, вы хотите подчеркнуть, какая страница активна. Для этого router-link использует специальные классы:

    • router-link-active — назначается, если ссылка совпадает с текущим маршрутом по вложенности;
    • router-link-exact-active — применяется только при полном совпадении path.

    Вы можете задать свои классы с помощью свойств:

    <router-link
      to="/about"
      active-class="is-current"
      exact-active-class="is-exact"
    >
      О сайте
    </router-link>

    // Класс is-current появится при частичном совпадении, is-exact — только когда путь совпадает полностью

    Это полезно, если в вашем CSS уже есть дизайнерские классы для активных пунктов меню.

    Переходы со специфическим поведением

    Переход с добавлением (append)

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

    <router-link :to="{ path: 'settings' }" append>Настройки</router-link>

    // Если вы сейчас на /user, ссылка ведет на /user/settings, а не на /settings

    Параметры query и hash

    router-link может вести не только на путь, но и на путь с query-параметрами или якорями:

    <router-link :to="{ path: '/posts', query: { sort: 'date' }, hash: '#top' }">
      Сортировать по дате
    </router-link>

    // В адресной строке будет /posts?sort=date#top // Это удобно для фильтров, сортировок, внутренних якорей

    Когда вы используете router-link, на самом деле происходит:

    1. Элемент <a> получает специальный обработчик клика вместо обычного перехода;
    2. Клик вызывает межеуровневую функцию Vue Router, которая обновляет адресную строку через history.pushState (или hash, если роутер настроен так);
    3. Приложение реагирует на изменение маршрута, загружая нужный компонент;
    4. Страница не перезагружается — обновляется только контент.

    Благодаря этому эффекту вы получаете быстро работающую SPA-навигацию, SEO-friendly при правильной настройке, и хорошую интеграцию с devtools.

    Иногда нужно сделать ссылку неактивной (например, в случае disabled состояния). Важно понимать: router-link сам по себе не предоставляет prop disabled, как обычная кнопка. Однако вы можете реализовать эту логику самостоятельно:

    <template>
      <router-link
        :to="isAllowed ? '/admin' : ''"
        :tabindex="isAllowed ? 0 : -1"
        :aria-disabled="!isAllowed"
        :class="{ disabled: !isAllowed }"
        @click.prevent="!isAllowed"
      >
        Админ-панель
      </router-link>
    </template>
    
    // Переменная isAllowed управляет доступом
    // Событие @click.prevent предотвращает нежелательные переходы

    Добавьте стили для disabled, если требуется.

    Навигация в шаблонных циклах

    Очень частый случай — строить списки меню или галерей, используя router-link внутри v-for:

    <template>
      <nav>
        <ul>
          <li v-for="item in menuItems" :key="item.id">
            <router-link :to="item.path">{{ item.title }}</router-link>
          </li>
        </ul>
      </nav>
    </template>
    
    // menuItems массив с путями и названиями пунктов меню

    // Такая структура улучшает читаемость и масштабируемость кода

    Часто нужно переводить пользователя на другой маршрут не ссылкой, а программно (например, в результате запроса или после действия). Для этого используется router.push:

    // Импортируйте useRouter из 'vue-router' (работает в setup)
    import { useRouter } from 'vue-router'
    
    const router = useRouter()
    
    function goToProfile() {
      router.push('/profile') // или объект с именем маршрута и параметрами
    }

    // Такой способ удобен для кнопок, сабмитов форм и т.д.

    router-link же ориентирован именно на declarative-навигацию — то есть когда переход происходит по клику на ссылку.

    Docker-link одинаково хорошо работает и на десктопных браузерах, и в мобильных приложениях, построенных на основе Vue.js (например, с использованием frameworks типа Quasar или Vuetify). В PWA-приложениях поведение аналогично: SPA-переходы работают мгновенно, не грузят сервер, ссылки получают доступность для ассистивных технологий.

    • Всегда используйте router-link вместо обычных <a> для внутренних переходов. Это обеспечивает синхронизацию истории браузера и корректную работу Vue Router.
    • Если нужно перейти на внешний ресурс, не используйте router-link — используйте обычный <a href="...">.
    • Для SEO и SSR используйте meta-теги, prerendering, чтобы поисковики корректно сканировали ссылки.
    • Следите, чтобы ваши параметры маршрутов совпадали с конфигом роутера (например, путь должен содержать :userId, если вы передаете params).

    Заключение

    router-link — универсальный компонент Vue Router, который обеспечивает современную, удобную и реактивную навигацию в вашем приложении на Vue.js. Он снимает множество забот по синхронизации истории, визуальному оформлению активных страниц и поддержке сложных маршрутов с параметрами, query, hash и префиксами. Его удобно использовать как частью навигации в шапке, так и для сложных, вложенных меню, динамических и условных переходов. Освоив его, вы сможете существенно улучшить пользовательский опыт вашего приложения и поддерживать навигацию на профессиональном уровне.

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

    router-link предназначен только для внутренних маршрутов, управляемых Vue Router. Для внешних адресов используйте обычный тег <a> с target="_blank" или target="_self":

    <a href="https://example.com" target="_blank" rel="noopener">Открыть сайт</a>

    Вешайте обработчик @click с условием и вызовом event.preventDefault() вручную:

    <router-link :to="someRoute" @click="someCondition && $event.preventDefault()">
      Линк
    </router-link>

    Начиная с Vue Router 4, вместо свойства tag используйте scoped slot для полного контроля над рендером:

    <router-link to="/path" v-slot="{ href, navigate }">
      <li @click="navigate"><a :href="href">Ссылка</a></li>
    </router-link>

    Проверьте, совпадает ли точное значение to с текущим путем, а также не задали ли вы свой active-class или exact-active-class. Если используете именованный маршрут, убедитесь что params корректны.

    Router-link принимает любые стили, поэтому вы можете добавить класс или использовать scoped slot для рендера кнопки:

    <router-link to="/submit">
      <button class="btn">Отправить</button>
    </router-link>

    // При таком оформлении сохраняется SPA-навигация, а внешний вид — как у кнопки

    Стрелочка влевоИспользование Shadcn UI компонентов с Vue для продвинутых интерфейсовРабота с динамическим рендерингом и виртуальным DOM на Vue.jsСтрелочка вправо

    Все гайды по Vue

    Руководство по валидации форм во Vue.jsИнтеграция Tiptap для создания редакторов на VueРабота с таблицами во Vue через TanStackИнструкция по установке и компонентам Vue sliderУправление пакетами Vue js с помощью npmУправление пакетами и node modules в Vue проектахКак использовать meta для улучшения SEO на VueПолный гайд по компоненту messages во Vuejs5 правил использования Inertia с Vue и LaravelРабота с модулями и пакетами в VueИнструкция по работе с grid на VueGithub для Vue проектов - подробная инструкция по хранению и совместной работеНастройка ESLint для Vue проектов и поддержка качества кодаОбработка ошибок и отладка в Vue.jsИспользование Vue Devtools для отладки и мониторинга приложенийРабота с конфигурационными файлами и скриптами VueСоздание и настройка проектов Vue с помощью Vue CLI3 способа интеграции Chart.js с Vue для создания графиковРабота с Canvas во VueИнструкция по реализации календаря во VueРабота с Ant Design Vue для создания UI на Vue
    Обзор и использование утилит Vue для удобной разработкиРабота с обновлениями компонента и жизненным циклом updateРазрешение конфликтов и ошибок с помощью Vue resolveИспользование query-параметров и их обработка в маршрутах VueЗагрузка и управление состоянием загрузки в VueИспользование библиотек Vue для расширения функционалаРабота с JSON данными в приложениях VueКак работать с экземплярами компонента Instance во VueПолучение данных и API-запросы во Vue.jsЭкспорт и импорт данных и компонентов в VueОбработка событий и их передача между компонентами VuejsГайд по defineEmits на Vue 3Понимание core функционала Vue и его применениеПонимание и применение Composition API в Vue 3Понимание и работа с компилятором VueКогда и как использовать $emit и call во VueВзаимодействие с внешними API через Axios в Vue
    Веб приложения на Vue архитектура и лучшие практикиИспользование Vite для быстрого старта и сборки проектов на Vue 3Работа с URL и ссылками в приложениях на VueРабота с пользовательскими интерфейсами и UI библиотеками во VueОрганизация и структура исходных файлов в проектах VueИспользование Quasar Framework для разработки на Vue с готовыми UI-компонентамиОбзор популярных шаблонов и стартовых проектов на VueИнтеграция Vue с PHP для создания динамичных веб-приложенийКак организовать страницы и маршруты в проекте на VueNuxt JS и Vue 3 для SSR приложенийСоздание серверных приложений на Vue с помощью Nuxt jsИспользование Vue Native для разработки мобильных приложенийОрганизация и управление индексной страницей в проектах VueИспользование Docker для контейнеризации приложений на VueИнтеграция Vue.js с Django для создания полноценных веб-приложенийСоздание и работа с дистрибутивом build dist Vue приложенийРабота со стилями и CSS в Vue js для красивых интерфейсовСоздание и структурирование Vue.js приложенияКак исправить ошибку cannot find module vueНастройка и сборка проектов Vue с использованием современных инструментовИнтеграция Vue с Bitrix для корпоративных решенийРазработка административных панелей на Vue js
    5 библиотек для создания tree view во VueИнтеграция Tailwind CSS с Vue для современных интерфейсовИнтеграция Vue с серверной частью и HTTPS настройкамиКак обрабатывать async операции с Promise во VueИнтеграция Node.js и Vue.js для разработки приложенийРуководство по интеграции Vue js в NET проектыПримеры использования JSX во VueГайд по импорту и регистрации компонентов на VueМногоязычные приложения на Vue с i18nИнтеграция FLIR данных с Vue5 примеров использования filter во Vue для упрощения разработки3 примера реализации drag-and-drop во Vue
    Управление переменными и реактивными свойствами во VueИспользование v for и slot в VueПрименение v-bind для динамической привязки атрибутов в VueУправление пользователями и их данными в Vue приложенияхСоздание и использование UI Kit для Vue приложенийТипизация и использование TypeScript в VuejsИспользование шаблонов в Vue js для построения интерфейсовИспользование Swiper для создания слайдеров в VueРабота со стилями и стилизацией в VueСтруктура и особенности Single File Components SFC в VueРабота со SCSS в проектах на Vue для стилизацииРабота со скроллингом и прокруткой в Vue приложенияхПрименение script setup синтаксиса в Vue 3 для упрощения компонентовИспользование scoped стилей для изоляции CSS в компонентах Vue3 способа улучшить навигацию Vue с push()Обработка запросов и асинхронных операций в VueПонимание и использование provide inject для передачи данных между компонентамиПередача и использование props в Vue 3 для взаимодействия компонентовПередача данных между компонентами с помощью props в Vue jsУправление property и функциями во Vue.jsРабота со свойствами компонентов VueУправление параметрами и динамическими данными во VueРабота с lifecycle-хуком onMounted во VueОсновы работы с объектами в VueПонимание жизненного цикла компонента Vue js на примере mountedИспользование модальных окон modal в Vue приложенияхИспользование методов в компонентах Vue для обработки логикиИспользование метода map в Vue для обработки массивовИспользование хуков жизненного цикла Vue для управления состоянием компонентаРабота с ключами key в списках и компонентах VueОбработка пользовательского ввода в Vue.jsРабота с изображениями и их оптимизация в VueИспользование хуков жизненного цикла в VueОрганизация сеток и гридов для верстки интерфейсов на VueСоздание и управление формами в VueОрганизация файлов и структура проекта Vue.jsКомпоненты Vue создание передача данных события и emitРабота с динамическими компонентами и данными в Vue3 способа манипулирования DOM на VueРуководство по div во VueИспользование директив в Vue и их расширенные возможностиОсновы и применение директив в VueИспользование директив и их особенности на Vue с помощью defineИспользование компонентов datepicker в Vue для выбора датОрганизация циклов и итераций во VueКак работает компиляция Vue CoreСоздание и использование компонентов в Vue JSОбработка кликов и пользовательских событий в VueИспользование классов в Vue для организации кода и компонентовИспользование директивы checked для управления состоянием чекбоксов в VueГайд на checkbox компонент во VueОтображение данных в виде графиков с помощью Vue ChartСоздание и настройка кнопок в VueСоздание и настройка кнопок в Vue приложенияхРабота с lifecycle-хуками beforeCreate и beforeMount во VueИспользование массивов и методов их обработки в VueИспользование массивов и их обработка в Vue
    Использование Vuetify для создания современных интерфейсов на VueИспользование transition во VueТестирование компонентов и приложений на VueРабота с teleport для управления DOM во VueПять шагов по настройке SSR в VuejsИспользование Shadcn UI компонентов с Vue для продвинутых интерфейсовИспользование router-link для навигации в Vue RouterРабота с динамическим рендерингом и виртуальным DOM на Vue.jsИспользование ref для управления ссылками и реактивностью в Vue 3Использование Vue Pro и его преимущества для профессиональной разработкиРуководство по nextTick для работы с DOMСоздание и использование компонентов с помощью Vue js и CУправление состоянием и реактивностью через inject и provideДинамическое обновление компонентов и данных на VueГлубокое изучение документации Vue и как эффективно её использоватьИспользование Crystal с Vue для разработкиИспользование вычисляемых свойств для динамического отображения данных на Vue jsКак использовать require в Vue для динамического импорта модулейОптимизация производительности и предупреждения в Vue
    Открыть базу знаний