Як створити активний стиль маршрутизатора VueJS


79

Наразі моя сторінка містить компонент Navigation.vue. Я хочу зробити кожну навігацію наведеною та активною. Функція "наведення" працює, але "активна" - ні.

Ось як виглядає файл Navigation.vue:

<template>
    <div>
        <nav class="navbar navbar-expand-lg fixed-top row">

                    <router-link tag="li" class="col" class-active="active" to="/" exact>TIME</router-link>
                    <router-link tag="li" class="col" class-active="active" to="/CNN" exact>CNN</router-link>
                    <router-link tag="li" class="col" class-active="active" to="/TechCrunch" exact>TechCrunch</router-link>
                    <router-link tag="li" class="col" class-active="active" to="/BBCSport" exact>BBC Sport</router-link>
        </nav>
    </div>
</template>

І далі - стиль.

<style>

   nav li:hover,
   nav li:active{
      background-color: indianred;
      cursor: pointer;
    }

</style>

Ось так виглядає наведення зараз і очікується точно так само на активному. Ось так виглядає наведення зараз і очікується точно так само на активному.

Буду вдячний, якщо ви дасте мені пораду щодо стилізації активних робіт маршрутизатора. Дякую.



Привіт @Bert, дякую за ваш коментар. Я спробував <router-link-exact-active> замість <router-link>, але поки не працює.
— doobean

Це не там, де ви це вказуєте. Ви вказуєте linkExactActiveClassяк властивість вашого маршрутизатора (куди ви додаєте routes).
— Берт

TY @KateYeeumLee за це запитання. Якраз готувався побудувати щось подібне і зрозумів, що це має бути його власний компонент - а не частина TheHeader.vue :)
— CodeFinity

Відповіді:


178

: Активний псевдо-клас не те ж саме , як додавання класу стилю елемента.

Псевдо-клас CSS: активний представляє елемент (наприклад, кнопку), який активується користувачем. При використанні миші "активація", як правило, починається при натисканні кнопки миші і закінчується, коли вона відпускається.

Ми шукаємо клас, наприклад .active, який ми можемо використовувати для стилювання елемента навігації.

Для більш чіткого прикладу різниці між :activeі .activeдивіться наступний фрагмент:


Vue-Router

vue-routerавтоматично застосовує два активні класи .router-link-activeта .router-link-exact-active, до <router-link>компонента.


router-link-active

Цей клас застосовується автоматично до <router-link>компонента, коли узгоджується його цільовий маршрут.

Це працює шляхом використання інклюзивної поведінки збігів. Наприклад, <router-link to="/foo">застосує цей клас до тих пір, поки поточний шлях починається з /foo/або є /foo.

Отже, якби ми мали <router-link to="/foo">і <router-link to="/foo/bar">, обидва компоненти отримали б router-link-activeклас, коли шлях є /foo/bar.


router-link-exact-active

Цей клас застосовується автоматично до <router-link>компонента, коли його цільовий маршрут точно відповідає. Візьміть до уваги, що в цьому випадку обидва класи, router-link-activeі router-link-exact-active, будуть застосовані до компонента.

Використовуючи той самий приклад, якби ми мали <router-link to="/foo">і <router-link to="/foo/bar">, router-link-exact-activeклас застосовувався б лише тоді, <router-link to="/foo/bar">коли шлях є /foo/bar.


Точна опора

Скажімо, маємо <router-link to="/">, що станеться так, що цей компонент буде активним для кожного маршруту. Це не може бути те , що ми хочемо, щоб ми могли використовувати exactопору так: <router-link to="/" exact>. Тепер компонент буде застосовувати активний клас лише тоді, коли він точно відповідає /.


CSS

Ми можемо використовувати ці класи для стилювання нашого елементу, наприклад:

 nav li:hover,
 nav li.router-link-active,
 nav li.router-link-exact-active {
   background-color: indianred;
   cursor: pointer;
 }

<router-link>Тег був змінений з допомогою tagпропелера, <router-link tag="li" />.


Змінюйте класи за замовчуванням глобально

Якщо ми хочемо змінити класи за замовчуванням, надані vue-routerглобально, ми можемо зробити це, передавши деякі параметри vue-routerекземпляру приблизно так:

const router = new VueRouter({
  routes,
  linkActiveClass: "active",
  linkExactActiveClass: "exact-active",
})

Зміна класів за замовчуванням для кожного екземпляра компонента ( <router-link>)

Якщо замість цього ми хочемо змінити класи за замовчуванням на, <router-link>а не глобально, ми можемо зробити це, використовуючи атрибути active-classand exact-active-classтаку форму:

<router-link to="/foo" active-class="active">foo</router-link>

<router-link to="/bar" exact-active-class="exact-active">bar</router-link>

API v-slot

Vue Router 3.1.0+ пропонує низький рівень налаштування за допомогою слота з масштабом . Це зручно, коли ми хочемо стилізувати елемент-обгортку, як елемент списку <li>, але при цьому зберегти логіку навігації в елементі прив'язки <a>.

<router-link
  to="/foo"
  v-slot="{ href, route, navigate, isActive, isExactActive }"
>
  <li
    :class="[isActive && 'router-link-active', isExactActive && 'router-link-exact-active']"
  >
    <a :href="href" @click="navigate">{{ route.fullPath }}</a>
  </li>
</router-link>

Вибачте, але імена для мене не такі зрозумілі :) Що можна сказати про звичайні посилання, які не є активними або "точними"? У моєму випадку мої звичайні посилання стилізовані Vue небажаним чином. Зміна активного або точного стилів не впливає.
— Кокодоко

28

Під час створення маршрутизатора ви можете вказати linkExactActiveClassяк властивість, щоб встановити клас, який буде використовуватися для активного посилання маршрутизатора.

const routes = [
  { path: '/foo', component: Foo },
  { path: '/bar', component: Bar }
]

const router = new VueRouter({
  routes,
  linkActiveClass: "active", // active class for non-exact links.
  linkExactActiveClass: "active" // active class for *exact* links.
})

Це задокументовано тут .


Це працює добре, але в моєму додатку він завжди вважається /активним (оскільки такі URL-адреси /aboutмістять його).
— Scribblemacher

2
@Scribblemacher, якщо я правильно розумію, просто видаліть linkActiveClass codepen.io/Kradek/pen/zWQKYp
— Берт,

28

https://router.vuejs.org/en/api/router-link.html add attribute active-class = "active", наприклад:

<ul class="nav navbar-nav">
    <router-link tag="li" active-class="active" to="/" exact><a>Home</a></router-link>
    <router-link tag="li" active-class="active" to="/about"><a>About</a></router-link>
    <router-link tag="li" active-class="active" to="/permission-list"><a>Permisison</a></router-link>
</ul>

але чому також генерувати клас nuxt-посилання -Точний-активної, будь ласка , перевірте моє запитання тут stackoverflow.com/questions/54029794 / ...
— Freddy Sidauruk

хороша довідка. exactатрибут має значення , щоб уникнути помилкових спрацьовувань
— Jossef Harush

3

Як уже згадувалося вище, @Ricky вю-маршрутизатор автоматично застосовує дві активні класи, .router-link-activeі .router-link-exact-active, до компоненту.

Отже, щоб змінити активне посилання css використовуйте:

.router-link-exact-active{
 //your desired design when link is clicked
font-weight: 700;
}

1
як змусити це працювати, якщо ваш дизайн потребує іншого кольору для кожного пункту меню, коли він активний?
— GY22,

2

Просто додайте рішення @ Bert, щоб зробити його більш зрозумілим:

    const routes = [
  { path: '/foo', component: Foo },
  { path: '/bar', component: Bar }
]

const router = new VueRouter({
  routes,
  linkExactActiveClass: "active" // active class for *exact* links.
})

Як бачимо, цей рядок слід видалити:

linkActiveClass: "active", // active class for non-exact links.

таким чином, ТІЛЬКИ поточне посилання підсвічується. Це має стосуватися більшості випадків.

Девід

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.