customized-trigger.vue 1.6 KB

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