ant-design-vue中使用a-menu刷新页面后菜单仍选中高亮

目录

 一、Menu 所需参数

 二、API

 三、代码

概要:代码环境 vue3+antd

 一、Menu 所需参数

  1.  selectedKeys:当前选中的菜单项 key 数组
  2. openKeys:当前展开的 SubMenu 菜单项 key 数组
  3. openChange:SubMenu 展开/关闭的回调
  4. click:点击 MenuItem 调用此函数
  5. mode:菜单类型,现在支持垂直(vertical )、水平(horizontal )、和内嵌模式 (inline)三种

 二、API

 

 

 

三、代码

<a-menu
    :selectedKeys="[route.path]"
    :openKeys="openKeys"
    @openChange="onOpenChange"
    @click="menuClick"
    mode="inline"
    class="menu"
>
    <template v-for="(menuItem,index) in menus" :key="menuItem.path">
        <template v-if="menuItem.children && menuItem.children.length > 0">
            <a-sub-menu :key="menuItem.path">
                <template #title>
                    <span class="menu_title">
                        <component :is="menuItem.icon"></component>
                        <span>{{ menuItem.title }}</span>
                    </span>
                </template>
                <a-menu-item v-for="(child, childIndex) in menuItem.children" :key="child.path">{{ child.title }}</a-menu-item>
            </a-sub-menu>
        </template>
        <template v-else>
            <a-menu-item :key="menuItem.path">
                <component :is="menuItem.icon"></component>
                <span>{{ menuItem.title }}</span>
            </a-menu-item>
        </template>
    </template>
</a-menu>
<script setup>
import {computed, ref, onMounted} from 'vue'
import {useRoute, useRouter} from "vue-router"

const router = useRouter()
const route = useRoute()

const selectedKeys = ref([])
const openKeys = ref([])
//获取你自己的菜单数据
const menus = computed(() => layoutStore.menuInfos)

const onOpenChange = keys => {
    let keyArr = []
    if (keys.length > 0) {
        //取最后一项,最后一项才是你当前展开的菜单
        keyArr.push(keys[keys.length - 1])
    }
    openKeys.value = keyArr
    sessionStorage.setItem('openKeys', JSON.stringify(keyArr))
 }

const menuClick = (item) => {
    router.push(item.key)
    //判断是否是一级菜单,一级菜单item.keyPath长度为1,二级菜单item.keyPath长度为2,清空二级菜单展开数组openKeys
    if (item.keyPath.length == 1) {
        sessionStorage.removeItem('openKeys')
        openKeys.value = []
    }
}

onMounted(() => {
    const openKey = sessionStorage.getItem('openKeys')
    if (openKey) {
        openKeys.value = JSON.parse(openKey)
    }
})

</script>

 注意:

  • 子菜单绑定的key要是path路径
Ant Design Pro Vue 中,可以使用 ProLayout 组件来实现动态设置菜单高亮的效果。具体的实现步骤如下: 1. 在路由配置中,为需要高亮菜单项添加一个`meta`字段,例如: ```javascript { path: &#39;/dashboard&#39;, name: &#39;dashboard&#39;, component: () => import(&#39;@/views/dashboard/index.vue&#39;), meta: { menuKey: &#39;dashboard&#39; } } ``` 2. 在 ProLayout 组件中,使用`route`属性绑定路由信息,并在`menuHeaderRender`和`menuItemRender`中根据`meta`字段的值来动态设置菜单高亮的效果,例如: ```html <template> <pro-layout :route="route" :menu="menu"> <!-- 其他内容 --> </pro-layout> </template> <script> export default { data() { return { route: [], menu: { // 菜单配置 } } }, watch: { $route() { this.setMenuActiveKey() } }, created() { this.route = this.$router.options.routes this.setMenuActiveKey() }, methods: { setMenuActiveKey() { const menuKey = this.$route.meta.menuKey this.menu.defaultSelectedKeys = menuKey ? [menuKey] : [] this.menu.defaultOpenKeys = this.getDefaultOpenKeys(this.menu, menuKey) }, getDefaultOpenKeys(menu, key) { let defaultOpenKeys = [] for (const item of menu.children || []) { if (item.children) { defaultOpenKeys = defaultOpenKeys.concat(this.getDefaultOpenKeys(item, key)) } else if (item.key === key) { defaultOpenKeys.push(menu.key) } } return defaultOpenKeys }, menuHeaderRender({ menuHeaderRender }) { return menuHeaderRender && menuHeaderRender(this.menu) }, menuItemRender({ path, name, icon, children, meta }) { const { defaultSelectedKeys } = this.menu const isActive = defaultSelectedKeys.includes(meta.menuKey) return `<span class="menu-item ${isActive ? &#39;active&#39; : &#39;&#39;}"> <router-link :to="{ path: &#39;${path}&#39; }"> ${icon ? `<icon type="${icon}" />` : &#39;&#39;} <span>${name}</span> </router-link> ${children ? `<span class="arrow"></span>` : &#39;&#39;} </span>` } } } </script> <style> .menu-item.active { background-color: #1890ff; color: #fff; } </style> ``` 这样,当路由跳转到`/dashboard`时,对应的菜单项就会高亮显示。注意,在`menuItemRender`中,你需要根据需要自定义菜单项的渲染方式,以适应你的业务需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值