您的当前位置:首页>全部文章>文章详情

【Vue】Antd Pro Vue的使用(十二) —— 菜单选中高亮显示问题

CrazyPanda发表于:2024-05-14 15:11:23浏览:260次TAG:

Antd Pro Vue2这套框架的路由菜单有两个问题,

1、页面迁移子页面,父页面对应的菜单未能选中高亮显示

2、登录后默认的菜单或页面刷新后原来的菜单未选中高亮显示

网上查到的一些菜单配置都是新版本的,老版本并不支持这些方法,这里总结一下我的解决方法,如果大家有更好的解决方案,欢迎交流。


一、解决第一个问题

以我的菜单为例

商品列表是菜单页面,添加编辑商品是隐藏菜单,我把他们做成了兄弟菜单,而不是子菜单

/src/config/router.config.js配置如下

无标题.png

然后再/src/layouts/BasicLayout.vue页面做处理,这个页面是框架基础页面,菜单以及页面导航组件都集成在这里面

created方法里面,我做了一个路由监听,在路由route变化时触发

created () {

    this.$watch('$route', (val) => {
      var selector = this.$el.querySelectorAll('a')
      for (var i in selector) {
        if (selector[i].href) {
          if (selector[i].href && selector[i].href.includes(val.path)) {
          //判断是菜单标签,并且路径与当前页面路径相匹配,直接修改对应菜单背景色
            selector[i].parentElement.style.background = '#f47c4e'
          } else {
             //当前path不是菜单对应页面
            if (selector[i].href.includes('store/goods')) {
            //当前标签是商品列表
              if (val.path === '/store/goods/create' || val.path === '/store/goods/update' || val.path === '/store/goods/copy') {
              //当前path是新建、编辑、复制商品页面,即商品的子页面,让商品列表页面菜单选中
                selector[i].parentElement.style.background = '#f47c4e'
              } else {
              //当前path是不是商品的子页面,清除商品列表页面菜单选中
                selector[i].parentElement.style.background = 'none'
              }
            } else {
              //其他页面,清除选中样式
              selector[i].parentElement.style.background = 'none'
            }
          }
        }
      }
    })
  },

已上这个方法,经过多次修改,最终呈现出这个样子,

通过this.$el.querySelectorAll('a')获取所有a标签元素,遍历出菜单

selector[i].parentElement.style.background是给a标签的父元素设置样式,通过查看菜单元素确定

image.png

可以看到,如果菜单正常选中,菜单li标签会添加ant-menu-item-selected样式,来显示菜单高亮

原先我想着已经获取到标签了,直接给标签加上ant-menu-item-selected样式应该就好使,但事与愿违

页面path改变时,route监听方法触发的比实际样式改变的要早,触发之后,ant-menu-item-selected才会被清除掉,也就是说我加了也没用

最后使用了selector[i].parentElement.style.background方法来显示菜单高亮

注意:这个方法还有个问题,因为我用的是includes方法来匹配当前页面path和a标签href,所以如果有相似的菜单,比如/store/goods和/store/goods1,页面path是/store/goods时,两个菜单会同时匹配上,都会被设置选中样式,大家有这种情况的可以换其他方式匹配


二、解决第二个问题

根据第一个问题的解决方法,我想依样画葫芦,页面刷新时,把页面path对应菜单直接变成选中状态即可,但并没有这么简单

页面登录后跳转默认页面,或者页面刷新时,并不会触发route监听方法,但是可以获取到当前页面path

我想在/src/config/router.config.js页面created方法或者mounted方法中,遍历菜单元素,匹配当前path进行修改,最终发现created方法和mounted方法触发的时候,页面菜单还没有渲染完成,根本获取不到菜单元素,也就无法遍历了

最后是在没招了,做了个延迟,这样确实可行,正常获取到了菜单元素

mounted () {
    //延时处理菜单选中
    setTimeout(() => {
      var path = this.$route.path
      //根据a标签选中时的样式,获取对应元素
      var selector = this.$el.querySelectorAll('.router-link-active')
      for (var i in selector) {
      //匹配当前页面,设置菜单选中样式
        if (selector[i].href && selector[i].href.includes(path)) {
          selector[i].parentElement.style.background = '#f47c4e'
        }
      }
    }, 800)
  },

经多次测试,延时800比较合适,可以正常获取菜单元素,页面菜单选中速度可以接受。


猜你喜欢

【Vue】Antd Pro Vue的使用(三)—— table列表的使用
用了几天ant design pro vue,发现vue2真的不是很好用,各种写法好麻烦。还有研究组件时,一定要看低版本的组件,高版本都是vue3的,并不适用。vue2版本组件位置:https://1x.antdv.com/components/alert-cn/ 作为后台管理端,用到最多的就是table列表,官网给的有预览但是自己上手的时候有事另外一回事了,首先就是接口请求的数据结果,官网并没有介绍接口应该返回什么样的数据结构,导致接口成功请求到数据,但table就是无法正常显示,最终参考de
发表于:2024-04-26 浏览:377 TAG:
【Vue】Vue刷新页面的7中方法总结
vue使用中经常会用到刷新当前页面,下面总结一下几种常用的刷新方法,供大家参考。1、 使用 location.reload() 方法进行页面刷新使用 location.reload() 方法可以简单地实现当前页面的刷新,这个方法会重新加载当前页面,类似于用户点击浏览器的刷新按钮。在 Vue 中,可以将该方法绑定到 Vue 实例上,比如在 Vue 的 methods 中添加如下的方法:methods: {   refresh() { &n
发表于:2024-05-07 浏览:411 TAG:
【Vue】Antd Pro Vue的使用(八) —— 表单组件的常用配置
1、清除配置allow-clear在ant design react组件中,表单组件默认都有清除按钮(输入框右侧的小黑叉号),在vue组件中需要自己配置,即给组件加上allow-clear属性并且所有组件都支持这个属性,a-input、a-select、a-textarea、a-date-picker等都支持<a-form-item label="用户名">     <a-input   
发表于:2024-05-10 浏览:278 TAG:
【Vue】Vue3 开发实战分享——打印插件 Print.js 的使用(Vue3 + Nodejs + Print.js 实战)以及 el-table 与 el-pagination 的深入使用(下)
文章目录📋前情回顾&前言🎯关于 el-table1️⃣获取每行对应的内容数据2️⃣行内数据判断处理(过滤)3️⃣对表格内容的索引🧩项目中延申使用🎯关于 el-pagination1️⃣显示总条数与分页展示2️⃣跳转页和页码样式3️⃣设置为中文🧩项目中延申使用📝最后📋前情回顾&前言上一篇文章(Vue3 开发实战分享——打印插件 Print.js 的使用(Vue3 + Nodejs + Print.js 实战)以及 el-table 与 el-pagination 的深
发表于:2023-12-10 浏览:234 TAG:
【Vue】vue2vue3项目使用antd
前言项目研发需要,已经用了两年的ant design pro(react),因为会的人比较少,更多的人在使用vue,所以新项目决定使用antd vue来开发,好在比较熟悉了ant design组件的使用,也算是有一些基础。ant design 官网https://ant.design/index-cnantd vue 官网https://www.antdv.com/components/overview-cn 当前版本V4.1.2vue2项目-引入antd参考:https://www.antdv
发表于:2024-04-19 浏览:332 TAG:
【VUE】Vue3+Vite+TypeScript常用项目模块详解
 目录1.Vue3+Vite+TypeScript 概述1.1 vue3 1.1.1 Vue3  概述1.1.2 vue3的现状与发展趋势1.2 Vite1.2.1 现实问题1.2 搭建vite项目1.3 TypeScript1.3.1 TypeScript 定义1.3.2 TypeScript 基本数据类型 1.3.3 TypeScript语法简单介绍2. 项目配置简单概述2.1 eslint 校验代码工具配置2.1.1 eslint定义2.1
发表于:2024-02-21 浏览:446 TAG:
【VUE】vue3组件间的通信,父组件调用子组件方法
文章目录一、父组件数据传递N个层级的子组件二、使用v-model指令实现父子组件的双向绑定三、父组件props向子组件传值四、子组件emit向父组件传值五、通过expose和ref来实现父组件调用子组件的方法vue3 provide 与 injectA组件名称 app.vueB组件名称 provideB.vueC组件名称 provideCSetup.vue父组件名称 app.vue子组件名称 v-modelSetup.vue子组件 propsSetup.vue父组件 app.vuevue3 ev
发表于:2024-03-10 浏览:558 TAG:
【Vue】前端框架 Vue3框架 使用总结(一) Vue框架的基础使用
目录一、Vue3框架基础1、创建项目2、项目结构3、Vue基础语法4、组件之间通信5、组合式api二、VueRouter的基础使用1、安装2、使用案例3、完整案例步骤4、调优-路由懒加载三、Vuex数据管理1、实现案例 2、更改store状态,同步操作3、store中的计算属性4、redux里的异步操作Action5、模块化管理四、网络请求Vue3官方文档:Vue.js - 渐进式 JavaScript 框架 | Vue.js基础部分见官方文档一、Vue3框架基础1、创建项目安装yar
发表于:2023-12-05 浏览:781 TAG:
【Vue】Antd Pro Vue的使用(十) —— a-form表单赋值
在Ant Design Pro Vue中,为表单赋值通常涉及到两个方面:一是使用v-model进行双向绑定,二是直接通过this.form.setFieldsValue()方法设置表单字段的值。以下是一个简单的例子,展示如何为Ant Design Pro Vue中的表单赋值:首先,确保你已经在组件中引入了a-form-model和相关的表单字段组件比如a-form-model-item和a-input。在data函数中定义一个form对象,它包含了你想要绑定的表单字段。使用v-model指令将输
发表于:2024-05-10 浏览:301 TAG:
【Vue】Antd Pro Vue的使用(五)—— 多文件上传回显问题
需求: 多文件上传 ,上传的时候绑定fileList回显问题: 上传成功了,也拿到了后台返回的数据,但是onchang监听的时候,file的状态一直是uploading原因:onchange 只触发了一次解决: 使用单文件上传时@change事件会至少触发两次,一次file.status=uploading,最后一次要么是done或者error,handleUpload1(info) {       if (info
发表于:2024-05-06 浏览:341 TAG: