当前位置:首页 > VUE

vue如何实现菜单高亮

2026-01-21 22:08:16VUE

实现菜单高亮的方法

动态绑定class

通过v-bind:class或简写:class动态绑定高亮样式,结合当前路由或状态判断是否激活。例如:

<template>
  <div>
    <router-link 
      :to="/home" 
      :class="{ 'active': $route.path === '/home' }"
    >首页</router-link>
  </div>
</template>

<style>
.active {
  color: red;
  font-weight: bold;
}
</style>

使用vue-router的exact属性

对于嵌套路由或复杂路径匹配,exact可精确匹配路由路径:

<router-link to="/about" exact-active-class="active">关于</router-link>

配置全局默认高亮类名:

const router = new VueRouter({
  linkExactActiveClass: 'active'
})

监听路由变化

在非<router-link>的自定义菜单中,通过watch监听路由变化:

export default {
  data() {
    return {
      activePath: ''
    }
  },
  watch: {
    '$route.path'(newVal) {
      this.activePath = newVal;
    }
  }
}

模板中通过activePath判断:

<div :class="{ 'active': activePath === '/contact' }">联系我们</div>

使用计算属性

对于多级菜单或复杂逻辑,推荐使用计算属性动态返回高亮状态:

computed: {
  isHomeActive() {
    return this.$route.path === '/home' || this.$route.matched.some(route => route.path === '/home');
  }
}

第三方库辅助

使用vue-router-active-path等库简化高亮逻辑:

vue如何实现菜单高亮

import { isActive } from 'vue-router-active-path';
export default {
  methods: {
    checkActive(path) {
      return isActive(this.$route, path);
    }
  }
}

注意事项

  • 嵌套路由需使用$route.matched而非直接比较path
  • 动态路由参数需使用paramsquery进行匹配
  • 移动端需考虑触摸反馈与高亮状态的视觉区分

分享给朋友:

相关文章

vue实现菜单

vue实现菜单

使用 Vue 实现菜单 Vue 可以轻松实现动态菜单,通常结合路由和组件化思想。以下是一个基于 Vue 3 和 Vue Router 的菜单实现方案: 基础菜单结构 在 Vue 中,菜单通常是一个递…

css二级菜单制作

css二级菜单制作

使用纯CSS制作二级菜单 HTML结构采用嵌套的<ul>和<li>标签,主菜单项包含子菜单: <nav class="menu"> <ul>…

css制作二级菜单

css制作二级菜单

CSS制作二级菜单的方法 通过纯CSS实现二级菜单主要依赖HTML结构嵌套和CSS的:hover伪类选择器。以下是具体实现方式: HTML结构 <ul class="main-menu"&g…

vue如何实现ifream

vue如何实现ifream

Vue 中实现 iframe 的方法 在 Vue 中可以通过多种方式实现 iframe 的嵌入和控制。以下是几种常见的方法: 使用 HTML 原生 iframe 标签 在 Vue 模板中直接使用…

vue如何实现刷新

vue如何实现刷新

实现页面刷新的方法 在Vue中实现刷新功能可以通过以下几种方式实现: 使用location.reload() 直接调用浏览器的原生方法强制刷新整个页面: methods: { refreshP…

vue如何实现绑定

vue如何实现绑定

数据绑定基础 Vue 通过 v-bind 指令实现动态绑定 HTML 属性或组件 prop。基本语法为 v-bind:属性名="表达式",简写为 :属性名="表达式"。例如绑定 class 或 sty…