dynamic-tabs.vue 1.7 KB

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