Как использовать активный стиль VueJS router-link

На моей странице сейчас есть компонент 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>

Вот так выглядит наведение сейчас и ожидается точно так же при активном. «Вот

Буду признателен, если вы дадите мне совет по оформлению активных работ router-link. Спасибо.


person doobean    schedule 06.09.2017    source источник
comment
router.vuejs.org/en/api/options.html#linkexactactiveclass   -  person Bert    schedule 06.09.2017
comment
Привет @Bert, спасибо за ваш комментарий. Я пробовал ‹router-link-exact-active› вместо ‹router-link›, но пока не работает.   -  person doobean    schedule 06.09.2017
comment
Это не там, где вы указываете. Вы указываете linkExactActiveClass как свойство вашего маршрутизатора (где вы добавляете routes).   -  person Bert    schedule 06.09.2017
comment
TY @KateYeeumLee за этот вопрос. Просто собирался создать что-то подобное и понял, что это должен быть отдельный компонент, а не часть TheHeader.vue :)   -  person CodeFinity    schedule 05.08.2018


Ответы (6)


: активный псевдокласс - это не то же самое, что добавление класс для стилизации элемента.

Псевдокласс: active CSS представляет элемент (например, кнопку), который активируется пользователем. При использовании мыши «активация» обычно начинается при нажатии кнопки мыши и заканчивается при ее отпускании.

Мы ищем такой класс, как .active, который мы можем использовать для стилизации элемента навигации.

Более ясный пример разницы между :active и .active см. В следующем фрагменте:

li:active {
  background-color: #35495E;
}

li.active {
  background-color: #41B883;
}
<ul>
  <li>:active (pseudo-class) - Click me!</li>
  <li class="active">.active (class)</li>
</ul>


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-activeclass только применялся бы к <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>, а не глобально, мы можем сделать это с помощью _ 41_ и 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>
person Ricky    schedule 06.09.2017
comment
Извините, но имена мне не говорят сами за себя :) А что насчет обычных ссылок, которые не являются активными или точными? В моем случае мои обычные ссылки имеют нежелательный стиль в Vue. Изменение активного или точного стилей не имеет никакого эффекта. - person Kokodoko; 04.02.2018

При создании маршрутизатора вы можете указать 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.
})

Это задокументировано здесь.

person Bert    schedule 06.09.2017
comment
Это работает хорошо, но в моем приложении / всегда считается активным (поскольку URL-адреса типа /about содержат его). - person Scribblemacher; 13.04.2018
comment
@Scribblemacher, если я правильно понимаю, просто удалите linkActiveClass codepen.io/Kradek/pen/zWQKYp - person Bert; 13.04.2018

https://router.vuejs.org/en/api/router-link.html добавьте атрибут 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>
person Vi Quang Hòa    schedule 20.11.2017
comment
но зачем также создавать класс nuxt-link-точный-активный, пожалуйста, ответьте на мой вопрос здесь stackoverflow.com/questions/54029794/ - person Freddy Sidauruk; 04.01.2019
comment
хорошая ссылка. атрибут exact важен, чтобы избежать ложного срабатывания - person Jossef Harush; 11.03.2019
comment
самый простой ответ - person Ikong; 05.05.2021

Как упоминалось выше @Ricky, vue-router автоматически применяет к компоненту два активных класса .router-link-active и .router-link-exact-active.

Итак, чтобы изменить активную ссылку css, используйте:

.router-link-exact-active{
 //your desired design when link is clicked
font-weight: 700;
}
person Just Fun    schedule 06.03.2020
comment
как заставить это работать, если вашему дизайну нужен другой цвет для каждого пункта меню, когда он активен? - person GY22; 30.04.2020

Просто добавьте к решению @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.

таким образом подсвечивается ТОЛЬКО текущая ссылка. Это должно относиться к большинству случаев.

Дэйвид

person us_david    schedule 30.01.2020

Давайте упростим, вам не нужно читать документ о настраиваемом теге (как 16-летний веб-разработчик, у меня достаточно таких тегов, например, в struts, webwork, jsp, rails, а теперь это vuejs)

просто нажмите F12, и вы увидите исходный код, например:

<div>
    <a href="#/topologies" class="luelue">page1</a> 
    <a href="#/" aria-current="page" class="router-link-exact-active router-link-active">page2</a> 
    <a href="#/databases" class="">page3</a>
</div>

так что просто добавьте стили для .router-link-active или router-link-exact-active

Если вам нужна дополнительная информация, проверьте router-link api:

https://router.vuejs.org/en/api/#router-link < / а>

person Siwei    schedule 13.01.2021