当前位置: 首页 > news >正文

vue3 elementplus tabs切换实现

 

 Tabs 标签页 | Element Plus

<template><!-- editableTabsValue 是当前tab 的 name --><el-tabsv-model="editableTabsValue"type="border-card"editable@edit="handleTabsEdit"><!-- 这个是标签面板 面板数据 遍历 editableTabs 渲染--><el-tab-panev-for="item in editableTabs":key="item.name":label="item.title":name="item.name"><!-- 页面内容 采用这种写法 包裹 keep-alive 标签是 组件保持keep-alive --><router-view v-slot="{ Component }"><keep-alive><component :is="Component" /></keep-alive></router-view></el-tab-pane></el-tabs>
</template>
<script lang="ts" setup>
import { ref } from 'vue'
import type { TabPaneName } from 'element-plus'import { useRoute, useRouter } from 'vue-router'
import { watch } from 'vue'const route = useRoute()
const router = useRouter()const initTab = {title: route.meta.title || 'New Tab',name: '1',url: route.fullPath,
}
// 使用对象张开运算符 复制 initTab 直接使用 inittab指向的是同一个对象
// editableTabs tabs 数据 是一个数组 里面是对象 每个对象是一个标签页
const editableTabs = ref([{ ...initTab }])
// tabindex 是最新标签 name 新标签为 tabIndex = tabIndex + 1
let tabIndex = editableTabs.value.length
// 当前的激活页 name
const editableTabsValue = ref(editableTabs.value[0].name)// 监听 $route 对象的变化 如果路由发生变化 就更新 editableTabs 中的 url 和 title
watch(() => route.fullPath,(newPath) => {editableTabs.value.forEach((tab) => {if (tab.name === editableTabsValue.value) {if (tab.url === newPath) {return}tab.url = newPathtab.title = route.meta.title || 'New Tab'}})},{ deep: true },
)
// 监听 editableTabsValue 的变化
//如果 editableTabsValue 变化了 就是切换了标签页 就更新路由到对应标签页
watch(() => editableTabsValue.value,(newValue) => {editableTabs.value.forEach((tab) => {if (tab.name === newValue) {if (tab.url === route.fullPath) {return}router.push(tab.url)}})},
)
// 处理标签页的编辑事件
// targetName 是当前标签页的 name
const handleTabsEdit = (targetName: TabPaneName | undefined,action: 'remove' | 'add',
) => {if (action === 'add') {const newTabName = `${++tabIndex}`const newtab = { ...initTab }newtab.name = newTabNameeditableTabs.value.push(newtab)editableTabsValue.value = newTabName} else if (action === 'remove') {const tabs = editableTabs.valuelet activeName = editableTabsValue.value// 如果删除的是当前激活的标签页,需要找到下一个标签页作为新的激活页if (activeName === targetName) {tabs.forEach((tab, index) => {if (tab.name === targetName) {const nextTab = tabs[index + 1] || tabs[index - 1]if (nextTab) {activeName = nextTab.name}}})}editableTabsValue.value = activeNameeditableTabs.value = tabs.filter((tab) => tab.name !== targetName)}
}
</script>
<style>
.el-tabs__new-tab {margin-right: 20px;
}
</style>

 

相关文章:

  • 程序代码篇---python获取http界面上按钮或者数据输入
  • “二维前缀和”算法原理及模板
  • 亚马逊海卖助手有什么功能?海卖助手的主要功能与特点分析
  • mybatis中的resultMap的association及collectio的使用
  • Python训练营---Day29
  • 飞机飞行控制系统补偿模型辨识报告
  • 估分啦~全国青少年信息素养大赛部分赛项已考完~图形化/算法创意实践
  • 量子计算在金融科技中的应用前景
  • 系统思考:IT企业项目困境分析
  • ImgShrink:摄影暗房里的在线图片压缩工具开发记
  • 第5章 监控与回归测试:日志收集 · 代码覆盖率 · 静态分析 · 质量门
  • Vue 3 动态 ref 的使用方式(表格)
  • 字节跳动开源DeerFlow,解锁AI研究新姿势
  • 采用DHCP动态分配IP地址,如果某主机开机后没有得到DHCP服务器的响应。则该主机获取的IP地址为?
  • 组态王|如何创建组态王工程?
  • 零基础搭建!基于PP-ShiTuV2的轻量级图像识别系统(Docker+API部署指南)
  • printf在c语言中代表什么(非常详细)
  • 6.2.2邻接表法-图的存储
  • PWM讲解+STM32任意频率、占空比、脉宽生成函数介绍
  • boost之signal2
  • 北美票房|华纳又赢了,《死神来了6》开画远超预期
  • 墨海军训练舰在纽约撞桥,墨总统:对遇难者表示悲痛,将跟进调查
  • 浙江演艺集团7部作品组团来沪,今夏开启首届上海演出季
  • 中央提级巡视后,昆明厅官郭子贞接受审查调查
  • 侵害孩子者,必严惩不贷!3名性侵害未成年人罪犯被执行死刑
  • 普京调整俄陆军高层人事任命