vue+iView 动态侧边栏菜单保持高亮选中

iview 组件在使用过程中,多多少少有一些小坑,本文简单罗列一二:

避坑指南: 关于iview 侧边栏菜单未能展开高亮选中回显问题
应用场景:iview-admin下接入动态菜单后,刷新或链接跳入时回显失效

简单就是两个方面:动态菜单接入前和动态菜单接入后菜单保持高亮选中问题。

一,动态菜单接入前:

本博客中有一篇文章简单介绍了 iView跳转子菜单父级菜单保持高亮的实现方法:

:active-name="$route.name" 
  <side-menuaccordionref="sideMenu":active-name="$route.name":collapsed="collapsed"@on-select="turnToPage":menu-list="menuList"></side-menu>

菜单保持高亮选中

1,方法一:

跳转前页面的name保持一致,跳转页中meta中加

recoverName: ‘user-info’ // 和跳转前页面的name保持一致。

2,方法二:

:active-name="activeName()"
<side-menuaccordionref="sideMenu":active-name="activeName()":collapsed="collapsed"@on-select="turnToPage":menu-list="menuList">

method中加

activeName() {if (this.$route.meta.activeName){return this.$route.meta.activeName; }else{return this.$route.name; }},

这样两种方法都是没有问题的,但接入权限使用动态菜单时就存在一个问题:

刷新页面或使用链接跳转进入时就会出现跳转到首页,父菜单收起,子菜单未保持选中高亮

二,动态菜单接入后:

本博客中另一篇文章也简单介绍了 iview 动态渲染显示侧边栏菜单及获取选中数据,渲染方法:

:menu-list="menuList"

主要是动态菜单接入后,菜单高亮选中就会失效

main.vue 的mounted中接口动态获取菜单数据,渲染侧边栏菜单。

 store.dispatch('getMenuData').then(res => {}

菜单高亮选中失效问题解决方法:

我们可以通过方法 iview menu updateOpened updateActiveName属性:

updateOpened()
updateActiveName()
this.$refs.sideMenu.updateOpenName(this.$route.name);

在菜单请求后调用,但是必须在$nextTick里使用才有效

 store.dispatch('getMenuData').then(res => {if(this.$store.getters.menuList){this.$nextTick(() => {this.$refs.sideMenu.updateOpenName(this.$route.name);});}})

这样无论跳转还是强制刷新,侧边栏菜单是会展开的,但是选中的子菜单
依旧没有高亮选中回显

可以在side-menu侧边栏菜单组件中加updateActiveName属性方法更新

this.$refs.menu.updateActiveName() //保持高亮选中
updateOpenName (name) {if (name === this.$config.homeName) this.openedNames = []else this.openedNames = this.getOpenedNamesByActiveName(name)if(this.activeName){this.$nextTick(() => {this.$refs.menu.updateActiveName() //保持高亮选中})}},

三,部分主要代码:

1.main.vue中:

import SideMenu from "./components/side-menu";
    <Siderhide-triggercollapsible:width="200":collapsed-width="64"v-model="collapsed"class="left-sider":style="{overflow: 'hidden'}"><side-menuaccordionref="sideMenu":active-name="activeName()":collapsed="collapsed"@on-select="turnToPage":menu-list="menuList"></side-menu></Sider>

2.side-menu组件中

<template><div class="side-menu-wrapper"><slot></slot><Menu ref="menu" v-show="!collapsed" :active-name="activeName" :open-names="openedNames" :accordion="accordion" :theme="theme" width="auto" @on-select="handleSelect"><template v-for="item in menuList"><template v-if="item.children && item.children.length === 1"><side-menu-item v-if="showChildren(item)" :key="`menu-${item.name}`" :parent-item="item"></side-menu-item><menu-item v-else :name="getNameOrHref(item, true)" :key="`menu-${item.children[0].name}`"><common-icon :type="item.children[0].icon || ''"/><span>{{ showTitle(item.children[0]) }}</span></menu-item></template><template v-else><side-menu-item v-if="showChildren(item)" :key="`menu-${item.name}`" :parent-item="item"></side-menu-item><menu-item v-else :name="getNameOrHref(item)" :key="`menu-${item.name}`"><common-icon :type="item.icon || ''"/><span>{{ showTitle(item) }}</span></menu-item></template></template></Menu><div class="menu-collapsed" v-show="collapsed" :list="menuList"><template v-for="item in menuList"><collapsed-menu :center="true" v-if="item.children && item.children.length > 1" @on-click="handleSelect" hide-title :root-icon-size="rootIconSize" :icon-size="iconSize" :theme="theme" :parent-item="item" :key="`drop-menu-${item.name}`"></collapsed-menu><Tooltip transfer v-else :content="showTitle(item.children && item.children[0] ? item.children[0] : item)" placement="right" :key="`drop-menu-${item.name}`"><a @click="handleSelect(getNameOrHref(item, true))" class="drop-menu-a" :style="{textAlign: 'center'}"><common-icon :right="0" :size="item.size" :color="textColor" :type="item.icon || (item.children && item.children[0].icon)"/></a></Tooltip></template></div></div>
</template>
<script>
import SideMenuItem from './side-menu-item.vue'
import CollapsedMenu from './collapsed-menu.vue'
import { getUnion } from '@/libs/tools'
import mixin from './mixin'
export default {name: 'SideMenu',mixins: [ mixin ],components: {SideMenuItem,CollapsedMenu},props: {menuList: {type: Array,default () {return []}},collapsed: {type: Boolean},theme: {type: String,default: 'dark'},rootIconSize: {type: Number,default: 20},iconSize: {type: Number,default: 16},accordion: Boolean,activeName: {type: String,default: ''},openNames: {type: Array,default: () => []}},data () {return {openedNames: [],}},methods: {handleSelect (name) {this.$emit('on-select', name)},getOpenedNamesByActiveName (name) {return this.$route.matched.map(item => item.name).filter(item => item !== name)},updateOpenName (name) {if (name === this.$config.homeName) this.openedNames = []else this.openedNames = this.getOpenedNamesByActiveName(name)if(this.activeName){this.$nextTick(() => {this.$refs.menu.updateActiveName()})}},},computed: {textColor () {return this.theme === 'dark' ? '#fff' : '#495060'}},watch: {activeName (name) {if (this.accordion) this.openedNames = this.getOpenedNamesByActiveName(name)else this.openedNames = getUnion(this.openedNames, this.getOpenedNamesByActiveName(name))},openNames (newNames) {this.openedNames = newNames},openedNames () {this.$nextTick(() => {this.$refs.menu.updateOpened()})}},mounted () {this.openedNames = getUnion(this.openedNames, this.getOpenedNamesByActiveName(name))}
}
</script>
<style lang="less">
@import './side-menu.less';
</style>

往期更多精彩:

1.vue+iView 权限实践之动态显示侧边栏菜单
2.vue+iView 跳转子菜单父级菜单保持高亮
3.vue+iView 树形菜单回显与选中
4.vue+iView 实现导入与导出excel功能
5.vue+iView table分页勾选记忆功能

喜欢就多多点赞关注。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/170856.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins 重新定义 pom 内容,打包

文章目录 源码管理构建 源码管理 添加仓库地址&#xff0c;拉取凭证&#xff0c;选择需要的分支 构建 勾选 构建环境 下删除原始 build 配置&#xff0c;防止文件错误 Pre Steps 构建前处理 pom.xml &#xff0c;例如我是需要删除该模块的所有子模块配置&#xff0c;我这里…

【计算机毕设小程序案例】基于SpringBoot的小演员招募小程序

前言&#xff1a;我是IT源码社&#xff0c;从事计算机开发行业数年&#xff0c;专注Java领域&#xff0c;专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务 &#x1f449;IT源码社-SpringBoot优质案例推荐&#x1f448; &#x1f449;IT源码社-小程序优质案例…

java-- 静态数组

1.静态初始化数组 定义数组的时候直接给数组赋值。 2.静态初始化数组的格式&#xff1a; 注意&#xff1a; 1."数据类型[] 数组名"也可以写成"数据类型 数组名[]"。 2.什么类型的数组只能存放什么类型的数据 3.数组在计算机中的基本原理 当计算机遇到…

Redis 配置文件(redis.conf)中文注释及说明

文章目录 一、概述二、觉见基础配置1.1 导入另一个配置文件1.2 添加Redis扩展1.3 绑定Redis服务在那些网卡上&#xff0c;也就是远程可以通过那个的IP地址访问。1.2 指定Redis服务监听端口1.2 最大分配内容大小1.2 后台服务方式运行1.2 日志记录文件1.2 添加扩展 三、完整配置文…

【EI会议征稿】 2024年遥感、测绘与图像处理国际学术会议(RSMIP2024)

2024年遥感、测绘与图像处理国际学术会议(RSMIP2024) 2024 International Conference on Remote Sensing, Mapping and Image Processing 2024年遥感、测绘与图像处理国际学术会议(RSMIP2024)将于2024年1月19日-21日在中国厦门举行。会议主要围绕遥感、测绘与图像处理等研究领…

为什么进行压力测试? 有哪些方法?

在信息技术飞速发展的今天&#xff0c;软件系统的性能已经成为了用户满意度的决定性因素之一。而要确保一个系统在实际使用中能够稳定可靠地运行&#xff0c;压力测试就显得尤为关键。本文将深入探讨什么是压力测试&#xff0c;为什么它是如此重要&#xff0c;以及一些常见的压…

Python深度学习实战-基于tensorflow.keras六步法搭建神经网络(附源码和实现效果)

实现功能 第一步&#xff1a;import tensorflow as tf&#xff1a;导入模块 第二步&#xff1a;制定输入网络的训练集和测试集 第三步&#xff1a;tf.keras.models.Sequential()&#xff1a;搭建网络结构 第四步&#xff1a;model.compile()&#xff1a;配置训练方法 第五…

k8s-----24、亲和力Affinity

1、应用场景 pod和节点间的关系&#xff1a; 某些Pod优先选择有ssdtrue标签的节点&#xff0c;如果没有在考虑部署到其它节点;某些Pod需要部署在ssdtrue和typephysical的节点上&#xff0c;但是优先部署在ssdtrue的节点上; pod和pod间的关系&#xff1a; 同一个应用的Pod不…

【软件安装】Windows系统中使用miniserve搭建一个文件服务器

这篇文章&#xff0c;主要介绍如何在Windows系统中使用miniserve搭建一个文件服务器。 目录 一、搭建文件服务器 1.1、下载miniserve 1.2、启动miniserve服务 1.3、指定根目录 1.4、开启访问日志 1.5、指定启动端口 1.6、设置用户认证 1.7、设置界面主题 &#xff08;…

大数据-Storm流式框架(二)--wordcount案例

一、编写wordcount案例 1、新建java项目 2、添加storm的jar包 storm软件包中lib目录下的所有jar包 3、编写java类 WordCountTopology.java package com.bjsxt.storm.wc;import backtype.storm.Config; import backtype.storm.LocalCluster; import backtype.storm.genera…

华为数通方向HCIP-DataCom H12-831题库(多选题:61-80)

第61题 在MPLS VPN中,为了区分使用相同地址空间的IPV4前缀,将IPV4的地址增加了RD值,下列选项描述正确的是: A、在PE设备上,每一个VPN实例都对应一个RD值,同一PE设备上,必须保证RD值唯一 B、RD可用于来控制VPN路由信息的发布 C、RD在传递过程中作为BGP的扩展团体性封装在…

Vuex 动态模块状态管理器

模块化思想 我们之前的博文已经讲述了Vuex怎么使用命名空间实现模块化状态管理。详情可以看&#xff1a; Vuex命名空间及如何获取根模块、兄弟模块状态管理器_AI3D_WebEngineer的博客-CSDN博客https://blog.csdn.net/weixin_42274805/article/details/133269196?ops_request_…

Python-自动化绘制股票价格通道线

常规方案 通过将高点/低点与其 2 个或 3 个相邻点进行比较来检测枢轴点,并检查它是否是其中的最高/最低点。对所有枢轴点进行线性回归以获得上方和下方趋势线。价格离开通道后建仓。通过这样做,我们得到如下所示的价格通道。我认为我们可以利用给定的数据取得更好的结果。

【数据结构】数组和字符串(五):特殊矩阵的压缩存储:稀疏矩阵——压缩稀疏行(CSR)

文章目录 4.2.1 矩阵的数组表示4.2.2 特殊矩阵的压缩存储a. 对角矩阵的压缩存储b~c. 三角、对称矩阵的压缩存储d. 稀疏矩阵的压缩存储——三元组表e. 压缩稀疏行&#xff08;Compressed Sparse Row&#xff0c;CSR&#xff09;矩阵结构体创建CSR矩阵元素设置初始化打印矩阵销毁…

22 行为型模式-状态模式

1 状态模式介绍 2 状态模式结构 3 状态模式实现 代码示例 //抽象状态接口 public interface State {//声明抽象方法,不同具体状态类可以有不同实现void handle(Context context); }

Jmeter(十六):jmeter场景的运行架构配置远程负载机详解

jmeter场景的运行架构(本地运行和远程运行) 运行方式&#xff1a; GUI运行&#xff1a;通过图形界面方式运行&#xff0c;该运行方式的可视化界面及监听器动态展示 结果都比较消耗负载机资源&#xff0c;建议大并发时不用&#xff0c;一般进行脚本调试&#xff1b; 命令行运行…

软考系统架构师知识点集锦二:软件工程

一、考情分析 二、考点精讲 2.1 软件过程模型 &#xff08;1&#xff09;原型模型 典型的原型开发方法模型。适用于需求不明确的场景,可以帮助用户明确需求。可以分为[抛弃型原型]与[演化型原型] 原型模型两个阶段: 1、原型开发阶段;2、目标软件开发阶段。 &#x…

世界经济论坛:ChatGPT等生成式AI,对全球23%岗位产生巨大影响

世界经济论坛与全球最大上市咨询公司之一埃森哲合作&#xff0c;联合发布了《未来工作&#xff1a;大语言模型与就业》白皮书。 世界经济论坛表示&#xff0c;随着ChatGPT、Midjourney、Github Copilot等生成式AI的飞速发展&#xff0c;对全球经济和劳动市场产生巨大影响。未来…

SpringBoot整合knife4j

1. 导包 SpringBoot版本&#xff1a;2.3.7.RELEASE <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.3</version></dependency>2. 配置 import com.…

JS加密/解密之那些不为人知的基础逻辑运算符

不多说&#xff0c;直接上干货 使用逻辑非运算符 ! 和双重逻辑非运算符 !!&#xff1a;例如 ![]、!![]、!0、!!0 和 !""、!!""。空字符串的转换&#xff1a;!"" 和 !!""。数组和对象的类型转换&#xff1a;[] []、[] - []、{} [] 和…