You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue3中如何为激活的router-link的父元素<li>添加active类

Vue3 给router-link的父元素
  • 添加active类的简便方法
  • 不用循环校验,Vue Router提供了更直接的方式,用router-link的**作用域插槽(v-slot)**就能轻松实现,直接把激活状态绑定到父元素<li>上:

    <ul>
      <li :class="{ active: isActive }">
        <router-link 
          :to="{ name: 'Dashboard' }" 
          class="nav-link"
          v-slot="{ isActive }"
        >
          Dashboard
        </router-link>
      </li>
      <li :class="{ active: isActive }">
        <router-link 
          :to="{ name: 'Login' }" 
          class="nav-link"
          v-slot="{ isActive }"
        >
          Login
        </router-link>
      </li>
    </ul>
    

    原理很简单:router-link的作用域插槽会暴露isActive(精确匹配激活)和isExactActive(完全匹配激活)这两个状态值,直接把它绑定到父元素<li>的class上就行,不用自己写校验逻辑。

    如果你的导航项很多,也可以把逻辑抽成一个组件,复用起来更方便:

    <!-- NavItem.vue -->
    <template>
      <li :class="{ active: isActive }">
        <router-link 
          :to="to" 
          class="nav-link"
          v-slot="{ isActive }"
        >
          <slot></slot>
        </router-link>
      </li>
    </template>
    
    <script setup>
    defineProps(['to'])
    </script>
    

    使用的时候就更简洁:

    <ul>
      <NavItem :to="{ name: 'Dashboard' }">Dashboard</NavItem>
      <NavItem :to="{ name: 'Login' }">Login</NavItem>
    </ul>
    

    另外还有个更简单的CSS方案,如果你只需要样式层面的效果,直接通过后代选择器给父元素加样式就行:

    /* 当子元素router-link激活时,给父li加样式 */
    li:has(.nav-link.active) {
      /* 你的激活样式 */
      background-color: #f0f0f0;
    }
    

    不过这个依赖CSS的:has()选择器,要注意浏览器兼容性(现代浏览器基本都支持)。

    内容的提问来源于stack exchange,提问作者Roi

    相关产品推荐
    方舟 Agent Plan

    超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

    最近更新时间:2026.06.17 13:14:52