vue实现el-menu与el-tabs联动

效果图如下:

在这里插入图片描述

当标签栏很多的时候效果图如下:

在这里插入图片描述

左侧菜单布局 ($route.path高亮显示激活路由 :default-active="$route.path"
<el-menu:default-active="$route.path"class="el-menu-vertical-demo"background-color="#323744"text-color="#fff"active-text-color="#409eff":collapse="iscollapse"unique-opened:collapse-transition="false"router><template v-for="(item, index) in menuList"><!-- 有下拉 --><el-submenu v-if="item.children" :index="item.id" :key="index"><template slot="title"><svg-icon :className="item.icon" :iconClass="item.icon"></svg-icon><span>{{ item.title }}</span></template><el-menu-item-groupv-for="(item, index) in item.children":key="index"><el-menu-item :index="item.path" @click="clickMenu(item)"><template slot="title"><svg-icon :className="item.icon" :iconClass="item.icon"></svg-icon><span>{{ item.subtitle1 }}</span></template></el-menu-item></el-menu-item-group></el-submenu><!-- 没有下拉 --><el-menu-item v-else :key="index" :index="item.path" @click="clickMenu(item)"><svg-icon :className="item.icon" :iconClass="item.icon"></svg-icon><span slot="title">{{ item.subtitle1 }}</span></el-menu-item></template></el-menu>
模拟数据如下:(以下路径均需在router/index.js里面进行配置)
menuList: [{id: "9",subtitle1: "首页",icon: "shangjiadianpu",path: "/welcome",},{id: "1",title: "用户管理",icon: "huangguanyonghu",children: [{id: "1-1",subtitle1: "时间-moment",icon: "huangguanyonghu",path: "/user",},{id: "1-2",subtitle1: "删除用户",icon: "huangguanyonghu",img: require("@/assets/logo.png"),path: "/user2",},{id: "1-3",subtitle1: "图片放大",icon: "huangguanyonghu",path: "/user3",},],},{id: "2",title: "表格",icon: "ershoujiaoyi",children: [{id: "2-1",subtitle1: "表格排序",icon: "ershoujiaoyi",path: "/tableSort",},{id: "2-2",subtitle1: "动画",icon: "ershoujiaoyi",path: "/animation",},{id: "2-3",subtitle1: "权限3",icon: "ershoujiaoyi",path: "/limit3",},],},{id: "6",subtitle1: "拖拽-sortablejs",icon: "shangpuchuzu",path: "/sortable",},{id: "7",title: "功能",icon: "ershoujiaoyi",children: [{id: "7-1",subtitle1: "上下滚动",icon: "ershoujiaoyi",path: "/numscroll",},{id: "7-9",subtitle1: "数字滚动",icon: "ershoujiaoyi",path: "/icountup",},{id: "7-2",subtitle1: "动画",icon: "ershoujiaoyi",path: "/animation",},{id: "7-3",subtitle1: "调用摄像头",icon: "ershoujiaoyi",path: "/opencamera",},{id: "7-4",subtitle1: "裁剪图片",icon: "ershoujiaoyi",path: "/cropperjs",},{id: "7-5",subtitle1: "裁剪图片2",icon: "ershoujiaoyi",path: "/vuecropper",},{id: "7-6",subtitle1: "打印功能",icon: "ershoujiaoyi",path: "/printjs",},{id: "7-7",subtitle1: "vue-pfd预览",icon: "ershoujiaoyi",path: "/vuepdf",},{id: "7-8",subtitle1: "内嵌iframe",icon: "ershoujiaoyi",path: "/iframepdf",},{id: "7-10",subtitle1: "放大镜功能",icon: "ershoujiaoyi",path: "/magnifier",},{id: "7-11",subtitle1: "多表头表格",icon: "ershoujiaoyi",path: "/xlsx",},{id: "7-12",subtitle1: "单表头表格",icon: "ershoujiaoyi",path: "/xlsx2",},{id: "7-13",subtitle1: "Vuecontextmenu",icon: "ershoujiaoyi",path: "/vuecontextmenu",},{id: "7-14",subtitle1: "vcontextmenu",icon: "ershoujiaoyi",path: "/vcontextmenu",},{id: "7-15",subtitle1: "表格合并",icon: "ershoujiaoyi",path: "/tablehebing",},{id: "7-16",subtitle1: "日期选择",icon: "ershoujiaoyi",path: "/datepicker",},{id: "7-17",subtitle1: "treeselect",icon: "ershoujiaoyi",path: "/treeselect",},{id: "7-19",subtitle1: "大屏数据",icon: "ershoujiaoyi",path: "/datav",},{id: "7-20",subtitle1: "左右菜单联动",icon: "ershoujiaoyi",path:'/leftrightmenu'},{id: "7-18",subtitle1: "测试页面",icon: "ershoujiaoyi",path: "/test",},],},],

主要内容区域标签栏布局如下:

	<el-tabsclass="vab-tabs-content"v-model="activeIndex"type="card"@tab-click="clickTab"@tab-remove="removeTab"><el-tab-panev-for="item of openTab"v-if="openTab.length":key="item.name":label="item.name":name="item.route":closable="isNoClosable(item)"></el-tab-pane></el-tabs>
标签栏样式
/deep/.el-tabs__header .el-tabs__nav{border:none;}/deep/.el-tabs--card>.el-tabs__header{border:none;}/deep/.el-tabs__header .el-tabs__item{padding:0 30px;border:none}/deep/.el-tabs__header .el-tabs__item.is-active {color: #1890ff;background: #e8f4ff;outline: none;-webkit-mask: url(~@/assets/images/tabs-bg.png);mask: url(~@/assets/images/tabs-bg.png);-webkit-mask-size: 100% 100%;mask-size: 100% 100%;
}/deep/.el-tabs__header .el-tabs__item:hover {color: #515a6e;background: #dee1e6;-webkit-mask: url(~@/assets/images/tabs-bg.png);mask: url(~@/assets/images/tabs-bg.png);-webkit-mask-size: 100% 100%;mask-size: 100% 100%;}/deep/.el-tabs--card > .el-tabs__header .el-tabs__item.is-closable:hover {padding-left: 30px;padding-right: 30px;}/deep/.el-tabs__header .el-tabs__item.is-active.is-closable {padding-left: 30px;padding-right: 30px;
}/deep/.el-tabs__header .el-tabs__item.is-active:hover {color: #1890ff !important;background: #e8f4ff !important;// padding: 0 30px 0 30px;}.el-tabs__header .el-tabs__item.is-active:hover {color: #1890ff;background: #e8f4ff;-webkit-mask: url(~@/assets/images/tabs-bg.png);mask: url(~@/assets/images/tabs-bg.png);-webkit-mask-size: 100% 100%;mask-size: 100% 100%;}
创建一个仓库模块 @/store/Modules/tabs.js

在这里插入图片描述

tabs.js代码如下

export default{namespaced: true,  //开启命名空间state: {openTab: JSON.parse(sessionStorage.getItem('openTab'))|| [],activeIndex: ''},mutations: {add_tabs (state, data) {//如果等于-1说明tabs不存在那么插入,否则什么都不做//findindex找角标,循环判断一下,如果等于那么就代表有相同的,就不必添加,如果找不到那就是-1.就添加let result = state.openTab.findIndex(item => item.name === data.name);result === -1 ? state.openTab.push(data) : '';// 存到本地 页面刷新不丢失sessionStorage.setItem('openTab',JSON.stringify(state.openTab))},delete_tabs (state, route) {let index = 0for (let gohh of state.openTab) {if (gohh.route === route) {break}index++}state.openTab.splice(index, 1)// 存到本地 页面刷新不丢失sessionStorage.setItem('openTab',JSON.stringify(state.openTab))},set_active_index (state, index) {console.log(index);state.activeIndex = index}}
}
将tab.js模块引入@store/index.js

import Vue from 'vue'
import Vuex from 'vuex
import tabs from './Modules/tabs'
Vue.use(Vuex)
export default new Vuex.Store({state: { },mutations: {},actions: {},modules: {tabs}
})
主要逻辑代码如下:
在主要内容区域引入如下代码获取tabs.js仓库里面的值在页面进行渲染
  computed: {openTab () {return this.$store.state.tabs.openTab},activeIndex: {get () {return this.$store.state.tabs.activeIndex},set (val) {this.$store.commit('tabs/set_active_index', val)}}},
左侧菜单导航绑定点击事件clickMenu,去触发仓库的add_tabs事件,把数组添加到openTab数组里面(添加前需要判断openTab是否有当前值,有就不添加,反之添加),把activeIndex也改变
clickMenu(val){//备注 :分模块触发事件可参考vue官网  '模块名/事件名'this.$store.commit('tabs/add_tabs',{route: val.path , name: val.subtitle1 })this.$store.commit('tabs/set_active_index', val.path)},
标签绑定点击事件clickTab 跳转到对应路由,给标签叉叉绑定removeTab (tab-remove 点击 tab 移除按钮后触发 被删除的标签的 name)拿到对应的路由进行判断

1、如果是首页则不删除;
2、如果删除的高亮激活这一项,则跳转到最后openTab数组的最后一项并高亮;
3、如果删除的不是高亮激活这一项,则不跳转,高亮激活项不变。

clickTab (tab) {console.log(tab);this.$router.push({path: this.activeIndex})},removeTab (target) {if(target == '/'||target == '/welcome'){return}this.$store.commit('tabs/delete_tabs', target)if (this.activeIndex === target) {// 设置当前激活的路由if (this.openTab && this.openTab.length >= 1) {console.log('=============', this.openTab[this.openTab.length - 1].route)this.$store.commit('tabs/set_active_index', this.openTab[this.openTab.length - 1].route)this.$router.push({path: this.activeIndex})}}},
el-tab-pane标签绑定属性 :closable="isNoClosable(item)判断el-tab-pane是否显示叉叉,除了首页不显示,其他均显示
isNoClosable(item){return item.route !== '/welcome'},
刷新时以当前路由做为tab加入tabs,当前路由不是首页时,添加首页以及另一页到store里,并设置激活状态,当前路由是首页时,添加首页到store,并设置激活状态(注意:this.$route.meta.title的title值要和菜单数据里面的subtitle1名称保持一致!!!)

在这里插入图片描述

mounted () {console.log(this.$route);// 刷新时以当前路由做为tab加入tabs// 当前路由不是首页时,添加首页以及另一页面到store里,并设置激活状态// 当前路由是首页时,添加首页到store,并设置激活状态if (this.$route.path !== '/welcome') {this.$store.commit('tabs/add_tabs', {route: '/welcome' , name: '首页'})this.$store.commit('tabs/add_tabs', {route: this.$route.path , name: this.$route.meta.title })this.$store.commit('tabs/set_active_index', this.$route.path)} else {this.$store.commit('tabs/add_tabs', {route: '/welcome', name: '首页'})this.$store.commit('tabs/set_active_index', '/welcome')}}

实现思路大致就是这样,主要自己项目的数据稍作修改。

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

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

相关文章

Visual Studio 2022安装教程(千字图文详解),手把手带你安装运行VS2022以及背景图设置

VS2022最新最全安装教程 很高兴你打开了这篇博客&#xff0c;接下来我们一起安装并且使用VS2022吧 文章目录 VS2022最新最全安装教程一.官网下载二.安装启动三.项目测试1.创建新项目2.选择我们使用的模板&#xff08;C空项目&#xff09;&#xff0c;继续冲&#xff01;3.进入…

微信小程序制作

如果你也想搭建一个小程序&#xff0c;但不知道如何入手&#xff0c;那么今天我就教你如何使用第三方制作平台&#xff0c;在短短三十分钟内搭建一个小程序。 一、登录小程序制作平台 首先&#xff0c;登录到小程序制作平台的官方网站或应用程序&#xff0c;进入后台管理系统。…

飞翔的鸟游戏

一.准备工作 首先创建一个新的Java项目命名为“飞翔的鸟”&#xff0c;并在src中创建一个包命名为“com.qiku.bird"&#xff0c;在这个包内分别创建4个类命名为“Bird”、“BirdGame”、“Column”、“Ground”&#xff0c;并向需要的图片素材导入到包内。 二.代码呈现 pa…

停车管理系统

1 用户信息管理 2 车位信息管理 3 车位费用设置 4 停泊车辆查询 5 车辆进出管理 6 用户个人中心 7 预定停车位 8 缴费信息 9 业务逻辑详解 1 用户停车&#xff1a;user用户登录&#xff0c;在预定停车位菜单&#xff0c;选择一个车位点击预定即可 2 车辆驶出&#xff1a;admin…

excel自己记录

1、清除换行符号 2、添加特殊符号&并清除换行符号 7日&15日&30日&60日 3、判断单元格最后一个字符是不是数字&#xff0c;不是就删掉 IF(ISNUMBER(--RIGHT(B2,1)),B2,SUBSTITUTE(B2,RIGHT(B2,1),"")) ISNUMBER(--RIGHT(B2,1))判断最右边的一个数是否…

模糊C均值聚类(Fuzzy C-means)算法(FCM)

本文的代码与数据地址已上传至github&#xff1a;https://github.com/helloWorldchn/MachineLearning 一、FCM算法简介 1、模糊集理论 L.A.Zadeh在1965年最早提出模糊集理论&#xff0c;在该理论中&#xff0c;针对传统的硬聚类算法其隶属度值非0即1的严格隶属关系&#xff…

基于51单片机音乐盒设计( proteus仿真+程序+原理图+PCB+报告+讲解视频)

音乐盒 主要功能&#xff1a;仿真原理图PCB图程序设计&#xff1a;设计报告实物图资料清单&#xff08;提供资料清单所有文件&#xff09;&#xff1a;资料下载链接&#xff1a; 基于51单片机音乐盒仿真设计( proteus仿真程序原理图PCB报告讲解视频&#xff09; 仿真图proteus …

接口测试学习路线

接口测试分为两种&#xff1a; 测试外部接口&#xff1a;系统和外部系统之间的接口 如&#xff1a;电商网站&#xff1a;支付宝支付 测试内部接口&#xff1a;系统内部的模块之间的联调&#xff0c;或者子系统之间的数据交互 测试重点&#xff1a;测试接口参数传递的正确性&…

鸿蒙 ark ui 网络请求 我不允许你不会

前言&#xff1a; 最近有在学习这个鸿蒙的ark ui开发 因为鸿蒙不是发布了一个鸿蒙next的测试版本 明年会启动纯血鸿蒙应用 所以我就想提前给大家写一些博客文章 效果图 11-24 16:26:22.005 25156-25156/com.example.httpsrequest E A0ff00/HTTPS: 请求状态 --> 200, %{pub…

C++ STL-----容器

STL容器就是将运用最广泛的一些数据结构实现出来 常用的数据结构&#xff1a;数组, 链表,树, 栈, 队列, 集合, 映射表 等 这些容器分为序列式容器和关联式容器两种: 序列式容器:强调值的排序&#xff0c;序列式容器中的每个元素均有固定的位置。 关联式容器:二叉树结构&…

外部 prometheus监控k8s集群资源(pod、CPU、service、namespace、deployment等)

prometheus监控k8s集群资源 一&#xff0c;通过CADvisior 监控pod的资源状态1.1 授权外边用户可以访问prometheus接口。1.2 获取token保存1.3 配置prometheus.yml 启动并查看状态1.4 Grafana 导入仪表盘 二&#xff0c;通过kube-state-metrics 监控k8s资源状态2.1 部署 kube-st…

onnx模型转换opset版本和固定动态输入尺寸

背景&#xff1a;之前我想把onnx模型从opset12变成opset12&#xff0c;太慌乱就没找着&#xff0c;最近找到了官网上有示例的&#xff0c;大爱onnx官网&#xff0c;分享给有需求没找着的小伙伴们。 1. onnx模型转换opset版本 官网示例&#xff1a; import onnx from onnx im…

C++多线程学习(二):多线程通信和锁

参考引用 C11 14 17 20 多线程从原理到线程池实战代码运行环境&#xff1a;Visual Studio 2019 1. 多线程状态 1.1 线程状态说明 初始化 (lnit)&#xff1a;该线程正在被创建就绪 (Ready)&#xff1a;该线程在就绪列表中&#xff0c;等待 CPU 调度运行 (Running)&#xff1a;…

Linux运行jmeter报错java.sql.SQLException:Cannot create PoolableConnectionFactory

在性能测试过程中遇见1个问题&#xff0c;终于解决了&#xff0c;具体问题如下。 问题 在windows电脑写jmeter脚本连接数据库连接成功 然后把该脚本放到Linux服务器上面&#xff0c;并把jmeter mysql驱动放到服务器上面&#xff0c;修改jmeter的mysql驱动路径信息 注意&…

【C++高阶(一)】二叉搜索树深度剖析

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 这里写目录标题 1. 前言2. 二叉搜索树的概念以及…

【Spring源码】Spring Event事件

目录 1、前言 2、什么是Spring Event&#xff1f; 3、基本使用 3.1、定义事件 3.2、发布事件 3.3、监听事件 3.3.1、继承ApplicationListener 3.3.2、使用EventListener注解 4、Spring Event是同步还是异步&#xff1f; 4.1、源码实现 4.2、如何实现异步 4.2.1、使用…

【差分放大电路分析】2021-12-31

缘由有哪位愿意帮助一下的-嵌入式-CSDN问答 截图&#xff0c;数值自己去计算。上2图是接电阻&#xff0c;下2图是接三极管。

DNS 区域传输 (AXFR)

漏洞描述 docker环境搭建 使用 AXFR 协议的 DNS 区域传输是跨 DNS 服务器复制 DNS 记录的最简单机制。为了避免在多个 DNS 服务器上编辑信息&#xff0c;可以在一台服务器上编辑信息&#xff0c;并使用 AXFR 将信息复制到其他服务器。但是&#xff0c;如果您不保护您的服务器&…

Javascript每天一道算法题(十八)——矩阵置零-中等

文章目录 1、问题2、示例3、解决方法&#xff08;1&#xff09;方法1——标记数组 1、问题 给定一个 y x x 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 2、示例 示例 1&#xff1a; 输入&#xff1a;matrix [[…

Centos 7、Debian、Ubuntu中tree指令的检查与下载

目录 前言 Centos 7中检查tree指令是否安装的两种办法 which指令检查 查看当前版本指令 不同版本下安装tree指令 Centos 7的发行版本 重点 Debian的发行版本 重点 Ubuntu的发行版本 重点 前言 在大多数Linux发行版中&#xff0c;tree命令通常不是默认安装的指令。…