导航菜单根据切换的页面高亮对应的菜单

407 阅读2分钟

技术栈:vue + ant design vue

期望: 使用ant design vue组件库中的menu渲染项目中的菜单项,当点击某个菜单项的时候展示相应的页面并高亮当前点击的菜单项(文字变蓝+背景样式)

问题: 当我点击标签页导致页面切换的时候,菜单则无法对应切换,或者刷新页面的时候就会导致左侧菜单的重置,无法继续根据展示的页面高亮对应的菜单

image-20231107172348205.png

菜单切换代码:

<a-menu-item key="role">
   	<template #icon>
     	<img src="@/assets/images/Tree/setting-user.png">
   	</template>
  	<router-link to="role">角色管理</router-link>
</a-menu-item>
<a-menu-item key="datagroup">
   	<template #icon>
     	 <img src="@/assets/images/Tree/setting-user.png">
    </template>
    <router-link to="datagroup">数据组管理</router-link>
</a-menu-item>
<a-menu-item key="flow">
    <template #icon>
         <img src="@/assets/images/Tree/setting-userS.png">
    </template>
    <router-link to="flow">流程管理</router-link>
</a-menu-item>

​ 当切换标签页或者刷新页面的时候(没有点击菜单切换组件),菜单的文字高亮蓝色是正常对应展示的组件高亮对应的菜单,但是菜单的背景样式无法跟随一起联动

解决思路:

​ 由于切换标签页(非菜单)的时候切换组件页面,文字是对应高亮蓝色:文字 <router-link to="flow">流程管理</router-link>是在菜单a-menu-item中包裹的,在这里文字对应切换是因为我在菜单中,使用router-link路由来去对应定义的切换组件的文字,所以文字会根据页面的切换对应高亮。根据文字去寻找文字所在的父级的menu菜单,为menu菜单设置样式来实现根据组件切换对应高亮菜单。

设置高亮:

image-20231107092910497.png

// 文字高亮
.ant-menu-title-content > .router-link-exact-active {
  font-weight: 600;
  color: #0273c4 !important;
}

使用css中的:has来去寻找一个元素的父元素

.ant-menu-item:has(> .ant-menu-title-content > .router-link-exact-active) {
  border-radius: 100px 14px 14px 100px;
  background-image: linear-gradient(270deg, #d5e5f7 4%, #ffffff 64%);
  position: relative;
  // background-repeat: no-repeat;
  overflow: hidden;
}

此时,就实现了菜单根据切换的组件对应高亮,其他的组件库同理。

总结:在menu菜单中使用router-link定义切换组件的文字,组件切换对应的router-link包裹的文字会新增类.ant-menu-title-content .router-link-exact-active,从该类使用css中的:has去寻找它的父类ant-menu-item,为其设置高亮样式,从而解决问题。