123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- <template>
- <div class="container">
- <el-tabs
- v-model="activeMenu"
- closable
- :stretch="false"
- type="card"
- @tab-remove="handleTabRemove"
- @tab-change="handleTabChange"
- >
- <el-tab-pane
- v-for="(item, index) in menuList"
- :key="index"
- :label="item.title"
- :name="item.id"
- >
- <div class="main">
- <mailList
- v-show="item.id.includes('folder')"
- :ref="'folder' + index"
- ></mailList>
- <mailDetail
- v-show="item.id.includes('detail')"
- :ref="'detail' + index"
- ></mailDetail>
- <mailWrite
- v-show="item.id.includes('write')"
- :ref="'write' + index"
- ></mailWrite>
- </div>
- </el-tab-pane>
- </el-tabs>
- </div>
- </template>
- <script setup>
- import mailList from "./mailList.vue";
- import mailDetail from "./mailDetail.vue";
- import mailWrite from "./mailWrite.vue";
- import useMailStore from "@/store/modules/mail";
- import { ElMessage, ElMessageBox } from "element-plus";
- import { nextTick, watch } from "vue";
- const mailStore = useMailStore();
- const { proxy } = getCurrentInstance();
- const menuList = ref([]);
- let activeMenu = ref("");
- // 订阅监听
- mailStore.$subscribe((mutations, state) => {
- activeMenu.value = state.currentId;
- menuList.value = state.mailMenuList;
- });
- const handleTabRemove = (id) => {
- const clickIndex = menuList.value.findIndex((x) => x.id === id);
- let currentMenu = {};
- if (menuList.value.length > 1) {
- // 如果删除的是当前菜单
- if (activeMenu.value === id) {
- if (menuList.value.length > clickIndex + 1) {
- currentMenu = menuList.value[clickIndex + 1];
- } else {
- currentMenu = menuList.value[clickIndex - 1];
- }
- // 更新store值
- mailStore.currentMenu = currentMenu;
- mailStore.currentId = currentMenu.id;
- }
- menuList.value.splice(clickIndex, 1);
- } else {
- return ElMessage({
- message: "最后一个标签页啦!",
- type: "info",
- });
- }
- };
- const checkType = (menu, type) => {
- // if (type == "write") return;
- const index = menuList.value.findIndex((x) => x.id === activeMenu.value);
- const dom = type + index.toString();
- nextTick(() => {
- if (type == "write") {
- proxy.$refs[dom][0].initFn();
- } else {
- proxy.$refs[dom][0].initFn();
- }
- });
- };
- const handleTabChange = (val) => {
- const currentMenu = menuList.value.find((x) => x.id === val);
- mailStore.$patch({
- currentId: val,
- currentMenu: currentMenu,
- });
- // 判断是文件夹还是邮件详情
- let type = "";
- if (currentMenu.id.includes("folder")) {
- type = "folder";
- // 如果更换的是文件夹菜单则更新左侧样式
- proxy.$emit("changeFloderId", currentMenu.folderId);
- } else if (currentMenu.id.includes("detail")) {
- type = "detail";
- } else {
- type = "write";
- }
- checkType(currentMenu, type);
- };
- onMounted(() => {});
- </script>
- <style lang="scss" scoped>
- .container {
- .main {
- height: calc(100vh - 180px);
- overflow: auto;
- }
- }
- </style>
|