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

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>

 

http://www.xdnf.cn/news/7028.html

相关文章:

  • Node.js 实战六:日志系统设计 —— 不只是 console.log,而是可追溯的行为记录链
  • Mac 在恢复模式下出现 旋转地球图标 但进度非常缓慢
  • 【android bluetooth 协议分析 01】【HCI 层介绍 3】【NUMBER_OF_COMPLETED_PACKETS 事件介绍】
  • 利用html制作简历网页和求职信息网页
  • Ubuntu 环境中 MATLAB 安装常见问题及解决方案
  • 【大模型系列】logprobs(对数概率)参数
  • boost变换器simulink仿真,开环,电压环控制,电流环控制,电压电流双闭环控制策略,含bode图
  • 从0开始学linux韦东山教程第四章问题小结(1)
  • React Native 0.68 安装react-native-picker报错:找不到compile
  • 整理了 2009 - 2025 年的【199 管综真题 + 解析】PDF,全套共 34 份文件
  • pycharm连接github(详细步骤)
  • 2025年- H28-Lc136- 24.两两交换链表中的节点(链表)---java版
  • 在超频单片机时,需要注意哪些稳定性问题?
  • 英语学习5.18
  • 深度估计中为什么需要已知相机基线(known camera baseline)?
  • 小白到高手的人工智能学习笔记之初步了解pytorch
  • 【图像生成大模型】HunyuanVideo:大规模视频生成模型的系统性框架
  • react深入2 - react-redux
  • LangChain框架实战:从入门到开发大模型应用
  • jupyter启动出现OSError: [Errno 28] No space left on device
  • LeetCode算 法 实 战 - - - 双 指 针 与 移 除 元 素、快 慢 指 针 与 删 除 有 序 数 组 中 的 重 复 项
  • 6.2.3+6.2.4十字链表、邻接多重表
  • Nginx配置与命令
  • 数据库中关于查询选课问题的解法
  • Appium自动化测试环境搭建及配置
  • [Linux]安装吧!我的软件包管理器!
  • 怎样免费开发部署自己的网站?
  • Spark 的运行模式(--master) 和 部署方式(--deploy-mode)
  • Linux进程信号(三)之信号产生2
  • Day29 类的装饰器