赞
踩
快速导航对于前端开发的靓仔们应该是很熟悉了,他能快速的切换到之前打开的页面,是系统更加灵活方便。我这里采用的是Vue+Element plus+Vuex+Router实现的快速导航,供大家参考。
快速导航具备的功能点
样式方面完全采用的是Element Plus提供的Tabs
组件和Dropdown
组件。
Tabs
组件和Dropdown
组件实现页面效果。代码如下<template> <div class="fast-nav"> <el-tabs v-model="router.currentRoute.value.name" type="card" class="tabs" closable @tab-click="handleClick" @contextmenu.prevent.native="openContextMenu($event)" @tab-remove="removeTab"> <el-tab-pane v-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>
//路由守卫监听路由变化存储路由信息到tbList中
router.beforeEach(async (to, from, next) => {
store.dispatch("tabList", to).then()
})
//页面获取tabList
import {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) //删除当前选中tab tabList.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且集合长度大于2 if (index === 1 && tabList.value.length > 2) { tabList.value.splice(2); } //下表大于1 if (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) //判断下表是否大于1 if (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 + 1, tabList.value.length - index); } } //关闭所有tab const closeAll = () => { //判断总长度是否大于1 if (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() break case 'b': closeOther() break case 'c': closeLeft() break case 'd': closeRight() break case 'e': closeAll() break } }
基于Vue+Element Plus实现快速导航完成了,主要涉及到的主要涉及到的知识点有Vue3、Vuex、Element Plus和Router,需要注意的就是计算下表的逻辑,还有就是快速导航绑定Dropdown
组件的地方。如果有更好的实现方式或有疑问的靓仔们评论区留言。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。