main.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. <template>
  2. <div class="container">
  3. <el-tabs
  4. v-model="activeMenu"
  5. closable
  6. :stretch="false"
  7. type="card"
  8. @tab-remove="handleTabRemove"
  9. @tab-change="handleTabChange"
  10. >
  11. <el-tab-pane
  12. v-for="(item, index) in menuList"
  13. :key="index"
  14. :label="item.title"
  15. :name="item.id"
  16. >
  17. <div class="main">
  18. <mailList
  19. v-show="item.id.includes('folder')"
  20. :ref="'folder' + index"
  21. ></mailList>
  22. <mailDetail
  23. v-show="item.id.includes('detail')"
  24. :ref="'detail' + index"
  25. ></mailDetail>
  26. <mailWrite
  27. v-show="item.id.includes('write')"
  28. :ref="'write' + index"
  29. ></mailWrite>
  30. </div>
  31. </el-tab-pane>
  32. </el-tabs>
  33. </div>
  34. </template>
  35. <script setup>
  36. import mailList from "./mailList.vue";
  37. import mailDetail from "./mailDetail.vue";
  38. import mailWrite from "./mailWrite.vue";
  39. import useMailStore from "@/store/modules/mail";
  40. import { ElMessage, ElMessageBox } from "element-plus";
  41. import { nextTick, watch } from "vue";
  42. const mailStore = useMailStore();
  43. const { proxy } = getCurrentInstance();
  44. const menuList = ref([]);
  45. let activeMenu = ref("");
  46. // 订阅监听
  47. mailStore.$subscribe((mutations, state) => {
  48. activeMenu.value = state.currentId;
  49. menuList.value = state.mailMenuList;
  50. });
  51. const handleTabRemove = (id) => {
  52. const clickIndex = menuList.value.findIndex((x) => x.id === id);
  53. let currentMenu = {};
  54. if (menuList.value.length > 1) {
  55. // 如果删除的是当前菜单
  56. if (activeMenu.value === id) {
  57. if (menuList.value.length > clickIndex + 1) {
  58. currentMenu = menuList.value[clickIndex + 1];
  59. } else {
  60. currentMenu = menuList.value[clickIndex - 1];
  61. }
  62. // 更新store值
  63. mailStore.currentMenu = currentMenu;
  64. mailStore.currentId = currentMenu.id;
  65. }
  66. menuList.value.splice(clickIndex, 1);
  67. } else {
  68. return ElMessage({
  69. message: "最后一个标签页啦!",
  70. type: "info",
  71. });
  72. }
  73. };
  74. const checkType = (menu, type) => {
  75. // if (type == "write") return;
  76. const index = menuList.value.findIndex((x) => x.id === activeMenu.value);
  77. const dom = type + index.toString();
  78. nextTick(() => {
  79. if (type == "write") {
  80. proxy.$refs[dom][0].initFn();
  81. } else {
  82. proxy.$refs[dom][0].initFn();
  83. }
  84. });
  85. };
  86. const handleTabChange = (val) => {
  87. const currentMenu = menuList.value.find((x) => x.id === val);
  88. mailStore.$patch({
  89. currentId: val,
  90. currentMenu: currentMenu,
  91. });
  92. // 判断是文件夹还是邮件详情
  93. let type = "";
  94. if (currentMenu.id.includes("folder")) {
  95. type = "folder";
  96. // 如果更换的是文件夹菜单则更新左侧样式
  97. proxy.$emit("changeFloderId", currentMenu.folderId);
  98. } else if (currentMenu.id.includes("detail")) {
  99. type = "detail";
  100. } else {
  101. type = "write";
  102. }
  103. checkType(currentMenu, type);
  104. };
  105. onMounted(() => {});
  106. </script>
  107. <style lang="scss" scoped>
  108. .container {
  109. .main {
  110. height: calc(100vh - 180px);
  111. overflow: auto;
  112. }
  113. }
  114. </style>