Активные ссылки
Часто в приложениях есть компонент навигации, который отображает список компонентов RouterLink. Внутри этого списка мы можем хотеть стилизовать ссылки на текущий активный маршрут по-другому, чем остальные.
Компонент RouterLink добавляет два CSS-класса к активным ссылкам: router-link-active
и router-link-exact-active
. Чтобы понять разницу между ними, сначала мы должны рассмотреть, как Vue Router определяет, что ссылка активна.
Когда ссылка считается активной?
Ссылка RouterLink считается активной, если:
- Она соответствует той же записи маршрута (т.е. настроенному маршруту), что и текущее расположение.
- Она имеет те же значения для
params
, что и текущее расположение.
Если вы используете вложенные маршруты, то любые ссылки на родительские маршруты также будут считаться активными, если соответствующие params
совпадают.
Другие свойства маршрута, такие как query
, не учитываются.
Путь не обязательно должен полностью совпадать. Например, при использовании alias
он все равно будет считаться совпадением, если он разрешается к той же записи маршрута и к тем же params
.
Если у маршрута есть свойство redirect
, он не будет выполняться при проверке, активна ли ссылка.
Точное совпадение активныx ссылок
Точное совпадение не включает родительские маршруты.
Допустим, у нас есть следующие маршруты:
const routes = [
{
path: '/user/:username',
component: User,
children: [
{
path: 'role/:roleId',
component: Role,
},
],
},
]
Теперь рассмотрим эти две ссылки:
<RouterLink to="/user/erina">
User
</RouterLink>
<RouterLink to="/user/erina/role/admin">
Role
</RouterLink>
Если текущий путь расположения - /user/erina/role/admin
, то обе эти ссылки будут считаться активными, поэтому класс router-link-active
будет применен к обеим ссылкам. Но только вторая ссылка будет считаться точной, поэтому только у этой второй ссылки будет класс router-link-exact-active
.
Настройка классов
Компонент RouterLink имеет два свойства, activeClass
и exactActiveClass
, которые можно использовать для изменения имен классов, которые применяются:
<RouterLink
activeClass="border-indigo-500"
exactActiveClass="border-indigo-700"
...
>
Имена классов по умолчанию также можно изменить глобально, передав параметры linkActiveClass
и linkExactActiveClass
в createRouter()
:
const router = createRouter({
linkActiveClass: 'border-indigo-500',
linkExactActiveClass: 'border-indigo-700',
// ...
})
См. Расширение RouterLink для более продвинутых способов настройки с использованием v-slot
API.