dynamic-tabs.vue 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <template>
  2. <el-tabs
  3. v-model="editableTabsValue"
  4. type="card"
  5. editable
  6. class="demo-tabs"
  7. @edit="handleTabsEdit"
  8. >
  9. <el-tab-pane
  10. v-for="item in editableTabs"
  11. :key="item.name"
  12. :label="item.title"
  13. :name="item.name"
  14. >
  15. {{ item.content }}
  16. </el-tab-pane>
  17. </el-tabs>
  18. </template>
  19. <script lang="ts" setup>
  20. import { ref } from 'vue'
  21. let tabIndex = 2
  22. const editableTabsValue = ref('2')
  23. const editableTabs = ref([
  24. {
  25. title: 'Tab 1',
  26. name: '1',
  27. content: 'Tab 1 content',
  28. },
  29. {
  30. title: 'Tab 2',
  31. name: '2',
  32. content: 'Tab 2 content',
  33. },
  34. ])
  35. const handleTabsEdit = (targetName: string, action: 'remove' | 'add') => {
  36. if (action === 'add') {
  37. const newTabName = `${++tabIndex}`
  38. editableTabs.value.push({
  39. title: 'New Tab',
  40. name: newTabName,
  41. content: 'New Tab content',
  42. })
  43. editableTabsValue.value = newTabName
  44. } else if (action === 'remove') {
  45. const tabs = editableTabs.value
  46. let activeName = editableTabsValue.value
  47. if (activeName === targetName) {
  48. tabs.forEach((tab, index) => {
  49. if (tab.name === targetName) {
  50. const nextTab = tabs[index + 1] || tabs[index - 1]
  51. if (nextTab) {
  52. activeName = nextTab.name
  53. }
  54. }
  55. })
  56. }
  57. editableTabsValue.value = activeName
  58. editableTabs.value = tabs.filter((tab) => tab.name !== targetName)
  59. }
  60. }
  61. </script>
  62. <style>
  63. .demo-tabs > .el-tabs__content {
  64. padding: 32px;
  65. color: #6b778c;
  66. font-size: 32px;
  67. font-weight: 600;
  68. }
  69. </style>