Декларативная навигация — это способ перехода между страницами в Vue Router с помощью компонента <router-link>. Вместо программного вызова router.push() разработчик описывает ссылку декларативно в шаблоне, а Vue Router обрабатывает переход.
Ключевые аспекты
router-link — компонент для создания навигационных ссылок
to — проп, указывающий целевой маршрут (строка или объект)
active-class — CSS-класс для активной ссылки
exact — точное совпадение пути для активного состояния
replace — заменяет текущую запись в истории вместо добавления
Используют <a href> вместо <router-link> — теряется SPA-поведение
Путают params (для динамических сегментов) и query (для ?параметров)
Не учитывают, что params требуют именованного маршрута
Рекомендации
Используйте router-link для всей внутренней навигации
Для внешних ссылок используйте обычный <a href>
Применяйте именованные маршруты — они устойчивы к изменению путей
Стилизуйте активные ссылки через router-link-active класс
Введение и проблематика
В веб-приложениях навигация между страницами — одна из базовых задач. В обычных сайтах каждый переход требует перезагрузки страницы. В SPA (Single Page Application) навигация происходит без перезагрузки — меняется только контент. Vue Router предлагает два способа навигации: декларативный (через компоненты) и программный (через JavaScript).
Декларативная навигация — это использование компонента router-link в шаблоне для создания ссылок. Это предпочтительный способ для большинства случаев навигации в Vue-приложениях.
Базовая теория
Компонент router-link
router-link — это компонент Vue Router, который рендерится как тег <a>, но перехватывает клик и выполняет навигацию без перезагрузки страницы.
Для более сложных случаев используйте объект с различными свойствами:
vue
<template><!-- По имени маршрута --> <router-link:to="{ name: 'user-profile' }"> Профиль </router-link><!-- С параметрами пути --> <router-link:to="{ name: 'user', params: { id: 42 } }"> Пользователь 42 </router-link><!-- С query параметрами --> <router-link:to="{ path: '/search', query: { q: 'vue', page: 1 } }"> Поиск </router-link><!-- С хэшем --> <router-link:to="{ path: '/docs', hash: '#installation' }"> Установка </router-link></template>
⚠️
При использовании объекта с path нельзя использовать params. Параметры работают только с именованными маршрутами (name). Query-параметры работают с обоими вариантами.
Props компонента router-link
Основные props
vue
<template><!-- to — целевой маршрут (обязательный) --> <router-linkto="/about">О нас</router-link><!-- replace — заменить запись в истории --> <router-linkto="/login"replace>Войти</router-link><!-- active-class — класс для активной ссылки --> <router-linkto="/home"active-class="is-active"> Главная </router-link><!-- exact-active-class — класс для точного совпадения --> <router-linkto="/"exact-active-class="exact-active"> Главная </router-link></template>
Prop custom и слот по умолчанию
С Vue Router 4 можно использовать слот для полного контроля над рендерингом:
vue
<template> <router-linkto="/about"customv-slot="{ navigate, isActive, href }"> <button@click="navigate":class="{ active: isActive }" > О нас </button> </router-link></template>
Слот предоставляет:
href — итоговый URL
navigate — функция для перехода
isActive — активен ли маршрут
isExactActive — точное совпадение маршрута
Активные классы
Vue Router автоматически добавляет CSS-классы активным ссылкам:
<scriptsetup>import { useRouter } from'vue-router'constrouter=useRouter()functionhandleLogin() {// Программная навигация после успешного входаrouter.push('/dashboard')}</script><template><!-- Декларативная навигация для обычных ссылок --> <router-linkto="/register">Регистрация</router-link><!-- Программная навигация после действия --> <button@click="handleLogin">Войти</button></template>