如何VueJS路由器链接活动样式


77

我的页面当前具有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-exact-active>而不是<router-link>,但目前尚无法使用。
doobean

那不是您指定的地方。您将指定linkExactActiveClass为路由器的属性(在其中添加routes)。
Bert

TY @KateYeeumLee回答这个问题。正准备构建类似的东西,并意识到它应该是它自己的组件-不属于TheHeader.vue :)
CodeFinity

Answers:


166

:有源伪类是不一样的添加类到风格的元素。

:active CSS伪类表示用户正在激活的元素(例如按钮)。使用鼠标时,“激活”通常在按下鼠标按钮时开始,在释放鼠标按钮时结束。

我们正在寻找的是一个类,例如.active,我们可以使用它来设置导航项目的样式。

对于之间的差别更清楚的例子:active,并.active请参阅下面的代码片段:


Vue路由器

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">and <router-link to="/foo/bar">,则router-link-active当path为时,两个组件都将获得该类/foo/bar


router-link-exact-active

<router-link>当其目标路线完全匹配时,此类将自动应用于组件。请注意,在这种情况下,类router-link-activerouter-link-exact-active都将应用于组件。

使用相同的示例,如果我们有<router-link to="/foo">and <router-link to="/foo/bar">,则在path为时才应用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-classandexact-active-class属性来进行更改,如下所示:

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

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

v插槽API

Vue Router 3.1.0+通过作用域插槽提供低级定制。当我们希望对包装元素(如list元素)进行样式设置<li>但仍将导航逻辑保留在anchor元素中时,这很方便<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以不必要的方式设置样式。更改活动样式或精确样式无效。
Kokodoko

27

创建路由器时,可以将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
Bert

27

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>

但为什么还会产生类nuxt链接,准确,有效,请查看我的问题在这里stackoverflow.com/questions/54029794/...
弗雷迪Sidauruk

很好的参考。该exact属性与避免错误触发相关
Jossef Harush

3

如上所述,@ 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;
}

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.

这样,只有当前链接才会亮起。这应适用于大多数情况。

大卫

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.