基于Vue+Element Plus实现快速导航
文章目录
- 前言
- 一、分析
- 二、实现
- 三、实现效果图
- 总结
前言
快速导航对于前端开发的靓仔们应该是很熟悉了,他能快速的切换到之前打开的页面,是系统更加灵活方便。我这里采用的是Vue+Element plus+Vuex+Router实现的快速导航,供大家参考。
一、分析
快速导航具备的功能点
- 展示打开过的导航项
- 点击导航项可以切换页面
- 导航关闭
- 导航关闭快捷方式(关闭当前、关闭其他、关闭左侧、关闭右侧和全部关闭)
样式方面完全采用的是Element Plus提供的Tabs
组件和Dropdown
组件。
二、实现
- 基于Element Plus提供的
Tabs
组件和Dropdown
组件实现页面效果。代码如下
<template><div class="fast-nav"><el-tabsv-model="router.currentRoute.value.name"type="card"class="tabs"closable@tab-click="handleClick"@contextmenu.prevent.native="openContextMenu($event)"@tab-remove="removeTab"><el-tab-panev-for="item in tabList":key="item.name":name="item.name"><template #label><el-space><el-icon style="font-size: 18px"><component class="el-icon" :is="item.menuIcon"></component></el-icon><span>{{ store.state.internationalization === 'zhCn' ? item.title : item.titleEn }}</span></el-space></template></el-tab-pane></el-tabs><el-dropdown ref="dropdown" @command="handleCommand" trigger="contextmenu" style="position: absolute"><span></span><template #dropdown><el-dropdown-menu><el-dropdown-item command="a" :icon="CircleClose">{{ $t('button.closeCurrent') }}</el-dropdown-item><el-dropdown-item command="b" :icon="CircleCloseFilled">{{ $t('button.closeOther') }}</el-dropdown-item><el-dropdown-item command="c" :icon="Back">{{ $t('button.closeLeft') }}</el-dropdown-item><el-dropdown-item command="d" :icon="Right">{{ $t('button.closeRight') }}</el-dropdown-item><el-dropdown-item command="e" :icon="DeleteFilled">{{ $t('button.closeAll') }}</el-dropdown-item></el-dropdown-menu></template></el-dropdown></div></template>
- 实现数据动态化
采用Vuex存储tabList集合,在路由跳转时存入到tabList集合中,关闭页面时再删除tabList中的对应项实现动态化,具体代码如下
//路由守卫监听路由变化存储路由信息到tbList中router.beforeEach(async (to, from, next) => {store.dispatch("tabList", to).then()})
//页面获取tabListimport {useStore} from "@/vuex/store";const store = useStore(); let tabList = ref(store.state.tabList)
- 实现快捷方式相关功能,具体代码如下
//关闭指定tab
const removeTab = (targetName: string) => {//首页不能关闭if (targetName === tabList.value[0].name) {return ElMessage.warning('工作台不能关闭 !!!')}//获取路由下标const index = tabList.value.findIndex(item => item.name === router.currentRoute.value.name)//获取当前选中的tab下标const current = tabList.value.findIndex(item => item.name === targetName)//删除当前选中tabtabList.value.splice(current, 1);//判断当前下标和路由下标是否相同,是->跳转前一位路由if (index === current){router.push(tabList.value[index - 1].name)}
}
//关闭当前tab
const closeItem = () => {if (router.currentRoute.value.name === tabList.value[0].name) {return ElMessage.warning('工作台不能关闭 !!!')}//获取路由下标const index = tabList.value.findIndex(item => item.name === router.currentRoute.value.name)//获取当前选中的tab下标tabList.value.splice(index, 1);//跳转前一位路由router.push(tabList.value[index - 1].name)
}
//关闭其他tab
const closeOther = () => {//获取路由下标const index = tabList.value.findIndex(item => item.name === router.currentRoute.value.name)//下表是否为0,是->删除0之后的所有数据if (index === 0) {tabList.value.splice(1);}//下表是否为1且集合长度大于2if (index === 1 && tabList.value.length > 2) {tabList.value.splice(2);}//下表大于1if (index > 1) {tabList.value.splice(1, index - 1);tabList.value.splice(2);}
}
//关闭左侧tab
const closeLeft = () => {//获取路由下标const index = tabList.value.findIndex(item => item.name === router.currentRoute.value.name)//判断下表是否大于1if (index > 1) {tabList.value.splice(1, index - 1);}
}
//关闭右侧tab
const closeRight = () => {//获取路由下标const index = tabList.value.findIndex(item => item.name === router.currentRoute.value.name)//判断下表是否小于总长度if (index < tabList.value.length - 1) {tabList.value.splice(index, tabList.value.length - index);}
}
//关闭所有tab
const closeAll = () => {//判断总长度是否大于1if (tabList.value.length > 1) {tabList.value.splice(1);}//跳转首页router.push(tabList.value[0].name)
}
//下拉菜单dom
const dropdown = ref()
//打开下拉菜单并重新定位
const openContextMenu = (e) => {dropdown.value.handleClose()setTimeout(() => {dropdown.value.$el.style.left = e.x + 'px'dropdown.value.$el.style.top = e.y + 'px'dropdown.value.handleOpen()}, 50)
}
const router = useRouter();
//点击tab跳转路由
const handleClick = (tab: TabsPaneContext) => {router.push(tab.paneName.toString())
}
//点击下拉菜单中的菜单
const handleCommand = (command: string | number | object) => {switch (command) {case 'a':closeItem()breakcase 'b':closeOther()breakcase 'c':closeLeft()breakcase 'd':closeRight()breakcase 'e':closeAll()break}
}
三、实现效果图
总结
基于Vue+Element Plus实现快速导航完成了,主要涉及到的主要涉及到的知识点有Vue3、Vuex、Element Plus和Router,需要注意的就是计算下表的逻辑,还有就是快速导航绑定Dropdown
组件的地方。如果有更好的实现方式或有疑问的靓仔们评论区留言。
基于Vue+Element Plus实现快速导航相关推荐
- RuoYi Vue - 若依框架的 Vue 版本,免费开源、生态强大、专业的 admin 后台管理系统,基于 Vue + Element
有一段时间没有推荐 admin 框架了,若依这款后台框架很强大,提供了 vue 版本,很实用,推荐给大家. 关于若依 RuoYi 中文名称叫若依,名字十分二次元,是一个后台管理系统,后端基于经典技术组 ...
- html全局布局 vue_基于Vue+Element的电商后台管理系统
前言 mall项目后台管理系统的前端项目. 项目介绍 mall-admin-web是一个电商后台管理系统的前端项目,基于Vue+Element实现. 主要包括商品管理.订单管理.会员管理.促销管理.运 ...
- 基于vue(element ui) + ssm + shiro 的权限框架
zhcc 基于vue(element ui) + ssm + shiro 的权限框架 引言 心声 现在的Java世界,各种资源很丰富,不得不说,从分布式,服务化,orm,再到前端控制,权限等等玲琅满目 ...
- 基于vue element 封装上传组件
基于vue element封装的上传组件 使用方法: 1.首先引入该组件 2.注册组件 3.页面使用 4.回调函数(如需其他回调自行封装 因为我暂时没用到其他的 哈哈哈) <template& ...
- 基于vue + element 的后台管理系统
该方案作为一套多功能的后台框架模板,适用于绝大部分的后台管理系统(Web Management System)开发.基于vue.js,使用vue-cli@3.2.3脚手架快速生成项目目录,引用Elem ...
- 基于Vue+Element UI+Node+MongoDB的医院门诊预约挂号系统
目录 概述 3 系统目标 3 需求分析 3 功能需求 3 非功能需求 4 设计 4 数据库设计 4 数据库说明 4 数据结构 4 接口设计 5 登录 5 注册.添加信息 6 查询信息 6 查询全部病人 ...
- 17. 基于Vue+Element+nodeJs+Express+MySql后台管理系统-前端主页面
这期开始主页面的编写,在src\views目录下创建主页面Home.vue,主要是管理系统页面布局,头部和左侧导航栏. 一.Home.vue 页面 1.1 Home.vue 页面html部分: < ...
- 基于vue+element实现多级菜单动态生成
使用element的NavMenu组件+vue的组件递归实现动态生成菜单. 首先创建对象记录菜单的标题.链接.子集等信息. menus: [{title: "首页",icon: & ...
- 闲云旅游网02(基于vue+element ui)
首页开发 项目GitHub地址:https://github.com/q2419068625/xianyun 新建公共组件 在components中新建应用统一的头部组件和页脚组件. 在默认布局中la ...
最新文章
- 站长新手入门:从0开始搭建微信小程序商城,不会代码也能开商城(附带源码)
- R语言实现sigmoid激活函数并可视化
- spyder怎么显示文件目录_MKV怎么转换为MP4?用它,快速转换!
- 类风湿性关节炎患者腕关节的多普勒超声积分与OMERACT RAMRIS骨髓水肿和滑膜相关...
- 基本数据类型存储空间
- python处理json数据_python处理json格式的数据
- b700a怎么连蓝牙_233621蓝牙2.1无线音箱B700A小测
- 信息学奥赛C++语言:换钱
- Spring Cloud Spring Boot mybatis分布式微服务云架构(五)构建RESTful API
- mysql单张表数据量极限_极限数据量范围的安全测试
- 固态硬盘开卡软件_SATAFIRM S11 MSATA固态硬盘刷固件
- 光学遥感和微波遥感异同点?影响微波散射的因素有哪些?
- c语言调用函数时二维数组实参,C语言函数调用二维数组,指针问题
- “诗词吾爱”第38期擂台赛《伤春、惜春》获胜作品欣赏【转载】
- 最新电影《D战》幕后真实案件:暗夜黑客组织被端
- 团购网站的发展趋势分析
- 网易云信消息抄送php,消息功能-服务端API文档-IM即时通讯-网易云信开发文档
- 骨龄仪存储卡损坏处理方案
- osg demo9 draw a quad
- 华为mate20 pro Android,聊一聊华为Mate20pro的十个缺点——华为Mate20pro使用心得
热门文章
- Hashcat密码破解攻略
- 压敏电阻特点,与普通电阻有什么不同?
- 最大开源代码sourceforge 简介 及视音频方面常用的开源代码
- open judge 内排序:Freda的越野跑
- Virual Studio 2022 C++ CLR 中 模拟 Android Studo,Eclipse 的 LogCat
- java递归获取树结构的指定层级、指定层级之上(向上递归(包含父集所有、爷爷集所有...)(父集单独、爷爷集单独...))、指定层级之下所有的(子集、孙子集...)和list集合转Tree树结构
- 跟熊浩学沟通30讲读后感_跟着熊浩学沟通的笔记
- 计算机进去bios方式,电脑的BIOS在哪?各电脑进入BIOS的方法
- JME3教程:Android创建一个简单的示例
- php可以用中文的单引号吗,PHP中单双引号用法误区