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

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

CrazyPanda发表于:2024-05-14 15:11:23浏览:277次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的使用(二)—— 全局配置及登录
1. 默认语言设置 Antd Pro Vue安装好之后,默认使用的是英文,我们需要把它设置为中文简体。找到/src/core/bootstrap.js文件,把最后一行 en-US 修改为 zh-CN,然后一定要清除浏览器缓存,修改才能生效修改后修改后的页面2. 请求服务端接口Antd Pro Vue封装好的有请求方法,在/src/api/文件夹,我们把自己的接口写到这里面就可以任意调用。Antd Pro Vue安装好之后,默认使用的是mock数据,我们要使用自己的接口,要把mock去掉
发表于:2024-04-25 浏览:472 TAG:
【Vue】Antd Pro Vue的使用(九) —— 抽屉a-drawer的操作按钮设置
在antd pro vue2中,a-drawer默认是没有操作按钮的,只有右上角的关闭'X'号,需要自己配置提交和取消按钮提交方法对应@submit方法,取消方法对应@close方法(a-model对应的取消方法是@cancel),都是父页面传过来的方法<a-drawer     :title="model ? '编辑类型' : '新建类型'"
发表于:2024-05-10 浏览:339 TAG:
【Vue】Vue的生命周期
Vue的生命周期指的是 Vue 实例从创建到销毁的整个过程。这个过程可以分为以下几个阶段:1. 创建前阶段 (beforeCreate):在实例初始化后执行,此时的数据监听和事件绑定机制都未完成,因此无法访问DOM节点。2. 创建后阶段 (created):Vue实例已经创建,数据侦听、计算属性、方法、事件/侦听器的回调函数已配置完毕,但挂载阶段还没开始,仍然无法获取到DOM元素。适合进行异步请求等操作。3. 挂载前阶段 (beforeMount):完成了DOM的初始化,但仍然无法获取到具体的D
发表于:2024-04-22 浏览:302 TAG:
【Vue】vue中sync作用
vue 中的 sync 修饰符用于在父组件和子组件之间实现双向数据绑定。它通过生成一个 v-model 指令,将子组件的 prop 与父组件的 prop 绑定在一起,从而实现数据同步。用法如下:1. 在子组件中使用 v-bind:prop.sync="parentprop",其中 prop 是子组件的 prop 名称,parentprop 是父组件绑定的 prop 名称。Vue 中 sync 作用在 Vue 中,sync 修饰符是一种特殊的语法糖,它允许在父组件和子组件之间进
发表于:2024-05-16 浏览:241 TAG:
【Vue】vue.js怎么定义一个组件
vue.js 中定义组件有三种方法:直接定义在 <script> 标签中并导出组件对象、使用组件工厂函数和 definecomponent 辅助函数创建、使用类定义组件并继承 vue.extend 创建。</script>如何在 Vue.js 中定义组件一、直接定义1. 在 <script></script> 标签中,使用 export default {} 导出组件对象:<code class="html"&g
发表于:2024-04-21 浏览:244 TAG:
【Vue】vue中destroy应用于什么场景
vue 中 destroy 方法用于销毁 vue 实例,释放其资源,应用场景有:组件销毁;页面路由切换;手动释放资源;避免内存泄漏。Vue 中 destroy 的应用场景Vue 中的 destroy 方法用于销毁一个 Vue 实例,释放其占用的资源。以下是一些常见的 destroy 应用场景:1. 组件销毁当一个组件不再需要时,可以使用 destroy 方法将其销毁,例如:this.$destroy();登录后复制2. 页面路由切换当页面路由切换时,旧的 Vue 实例需要被销毁,以释放其资源。可
发表于:2024-05-16 浏览:255 TAG:
【Vue】vue3比vue2好在哪里
vue 3 优于 vue 2 的关键优势包括:性能提升:响应式系统重写,优化更新速度虚拟 dom 优化,提高渲染效率代码组织和可维护性:组合式 api,提升可维护性teleport 和 suspense,提高代码灵活性和可读性开发者体验:更好的调试工具,简化调试过程typescript 2.7 支持,增强代码提示和类型检查Vue 3 与 Vue 2 的优势对比核心性能提升响应式系统重写:Vue 3 引入 Reactivity API,优化了响应式系统的性能,提升了更新速度。虚拟 DOM 优化:采
发表于:2024-04-28 浏览:322 TAG:
【Vue】vue框架怎么运行
vue.js是一个用于构建用户界面的javascript框架,其工作原理包括:模板编译:将html模板编译为vdom;响应式系统:检测数据变化并更新vdom;dom更新:有效更新dom,最小化操作次数;自动渲染:监视数据变化并自动重新渲染ui。Vue.js框架的工作原理Vue.js是一个用于构建用户界面(UI)的JavaScript框架。它采用“响应式”系统,当数据发生变化时,框架会自动更新UI,简化了Web开发过程。Vue.js框架的工作流程:1. 模板编译:Vue.js将HTML模板编译为虚
发表于:2024-04-21 浏览:315 TAG:
【VUE】如何查看前端的vue项目是vue2还是vue3项目
1. 检查package.json文件在项目的根目录下,打开package.json文件,查找dependencies或devDependencies部分中的vue条目。版本号将告诉你是Vue 2还是Vue 3。例如:Vue 2.x: "vue": "^2.x.x"Vue 3.x: "vue": "^3.x.x"2. 使用Vue Devtools如果项目正在运行,并且你已经安装了Vue Devtools(Vue开发者
发表于:2024-03-11 浏览:422 TAG:
【Vue】Vue中对axios进行封装的最佳实践
vue是当前前端开发中最常用的框架之一,而ajax请求又是前端开发中非常关键的一环。为了方便开发者使用,vue社区中出现了许多对ajax请求库axios进行封装的实践。本文将介绍vue中对axios进行封装的最佳实践,帮助您更好地理解如何在vue项目中使用axios。封装axios在Vue项目中,我们需要把axios进行封装以方便使用。这里介绍一个标准的axios封装:import axios from 'axios' import sto
发表于:2024-04-29 浏览:321 TAG: