customized-trigger.vue 1.7 KB

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