【Vue】Antd Pro Vue的使用(十二) —— 菜单选中高亮显示问题
Antd Pro Vue2这套框架的路由菜单有两个问题,
1、页面迁移子页面,父页面对应的菜单未能选中高亮显示
2、登录后默认的菜单或页面刷新后原来的菜单未选中高亮显示
网上查到的一些菜单配置都是新版本的,老版本并不支持这些方法,这里总结一下我的解决方法,如果大家有更好的解决方案,欢迎交流。
一、解决第一个问题
以我的菜单为例
商品列表是菜单页面,添加编辑商品是隐藏菜单,我把他们做成了兄弟菜单,而不是子菜单
/src/config/router.config.js配置如下
然后再/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标签的父元素设置样式,通过查看菜单元素确定
可以看到,如果菜单正常选中,菜单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去掉
- 【Vue】Antd Pro Vue的使用(九) —— 抽屉a-drawer的操作按钮设置
- 在antd pro vue2中,a-drawer默认是没有操作按钮的,只有右上角的关闭'X'号,需要自己配置提交和取消按钮提交方法对应@submit方法,取消方法对应@close方法(a-model对应的取消方法是@cancel),都是父页面传过来的方法<a-drawer :title="model ? '编辑类型' : '新建类型'"
- 【Vue】Vue的生命周期
- Vue的生命周期指的是 Vue 实例从创建到销毁的整个过程。这个过程可以分为以下几个阶段:1. 创建前阶段 (beforeCreate):在实例初始化后执行,此时的数据监听和事件绑定机制都未完成,因此无法访问DOM节点。2. 创建后阶段 (created):Vue实例已经创建,数据侦听、计算属性、方法、事件/侦听器的回调函数已配置完毕,但挂载阶段还没开始,仍然无法获取到DOM元素。适合进行异步请求等操作。3. 挂载前阶段 (beforeMount):完成了DOM的初始化,但仍然无法获取到具体的D
- 【Vue】vue中sync作用
- vue 中的 sync 修饰符用于在父组件和子组件之间实现双向数据绑定。它通过生成一个 v-model 指令,将子组件的 prop 与父组件的 prop 绑定在一起,从而实现数据同步。用法如下:1. 在子组件中使用 v-bind:prop.sync="parentprop",其中 prop 是子组件的 prop 名称,parentprop 是父组件绑定的 prop 名称。Vue 中 sync 作用在 Vue 中,sync 修饰符是一种特殊的语法糖,它允许在父组件和子组件之间进
- 【Vue】vue.js怎么定义一个组件
- vue.js 中定义组件有三种方法:直接定义在 <script> 标签中并导出组件对象、使用组件工厂函数和 definecomponent 辅助函数创建、使用类定义组件并继承 vue.extend 创建。</script>如何在 Vue.js 中定义组件一、直接定义1. 在 <script></script> 标签中,使用 export default {} 导出组件对象:<code class="html"&g
- 【Vue】vue中destroy应用于什么场景
- vue 中 destroy 方法用于销毁 vue 实例,释放其资源,应用场景有:组件销毁;页面路由切换;手动释放资源;避免内存泄漏。Vue 中 destroy 的应用场景Vue 中的 destroy 方法用于销毁一个 Vue 实例,释放其占用的资源。以下是一些常见的 destroy 应用场景:1. 组件销毁当一个组件不再需要时,可以使用 destroy 方法将其销毁,例如:this.$destroy();登录后复制2. 页面路由切换当页面路由切换时,旧的 Vue 实例需要被销毁,以释放其资源。可
- 【Vue】vue3比vue2好在哪里
- vue 3 优于 vue 2 的关键优势包括:性能提升:响应式系统重写,优化更新速度虚拟 dom 优化,提高渲染效率代码组织和可维护性:组合式 api,提升可维护性teleport 和 suspense,提高代码灵活性和可读性开发者体验:更好的调试工具,简化调试过程typescript 2.7 支持,增强代码提示和类型检查Vue 3 与 Vue 2 的优势对比核心性能提升响应式系统重写:Vue 3 引入 Reactivity API,优化了响应式系统的性能,提升了更新速度。虚拟 DOM 优化:采
- 【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模板编译为虚