|
@@ -61,7 +61,7 @@
|
|
|
:to="item.path"
|
|
:to="item.path"
|
|
|
v-for="(item, index) in menuList.data"
|
|
v-for="(item, index) in menuList.data"
|
|
|
:key="index"
|
|
:key="index"
|
|
|
- @click.stop="clickPath(index, item)"
|
|
|
|
|
|
|
+ @click="clickPath(index, item)"
|
|
|
><div
|
|
><div
|
|
|
style="position: relative"
|
|
style="position: relative"
|
|
|
:class="
|
|
:class="
|
|
@@ -93,26 +93,33 @@
|
|
|
<div class="tab_box">
|
|
<div class="tab_box">
|
|
|
<el-tabs
|
|
<el-tabs
|
|
|
v-model="editableTabsValue"
|
|
v-model="editableTabsValue"
|
|
|
|
|
+ @tab-change="clickTab"
|
|
|
|
|
+ addable
|
|
|
|
|
+ @tab-add="addTab"
|
|
|
type="card"
|
|
type="card"
|
|
|
class="demo-tabs"
|
|
class="demo-tabs"
|
|
|
- @tab-remove="removeTab"
|
|
|
|
|
>
|
|
>
|
|
|
<el-tab-pane
|
|
<el-tab-pane
|
|
|
- v-for="item in editableTabs"
|
|
|
|
|
|
|
+ v-for="item in toRaw(editableTabs)"
|
|
|
:key="item.path"
|
|
:key="item.path"
|
|
|
:label="item.label"
|
|
:label="item.label"
|
|
|
:name="item.path"
|
|
:name="item.path"
|
|
|
>
|
|
>
|
|
|
<template #label>
|
|
<template #label>
|
|
|
<div class="tab_pane">
|
|
<div class="tab_pane">
|
|
|
- <div class="tab_text">{{ item.title }}</div>
|
|
|
|
|
|
|
+ <div class="tab_text">{{ item.label }}</div>
|
|
|
<img src="@/assets/images/close.png" alt="" />
|
|
<img src="@/assets/images/close.png" alt="" />
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
</el-tab-pane>
|
|
</el-tab-pane>
|
|
|
</el-tabs>
|
|
</el-tabs>
|
|
|
</div>
|
|
</div>
|
|
|
- <router-view v-if="isAlive"></router-view>
|
|
|
|
|
|
|
+ <router-view v-slot="{ Component }" v-if="isAlive">
|
|
|
|
|
+ <!-- TODO文件缓存 点进文件掉createtabs生成tab -->
|
|
|
|
|
+ <KeepAlive>
|
|
|
|
|
+ <component :is="Component" />
|
|
|
|
|
+ </KeepAlive>
|
|
|
|
|
+ </router-view>
|
|
|
</el-main>
|
|
</el-main>
|
|
|
</el-container>
|
|
</el-container>
|
|
|
</el-container>
|
|
</el-container>
|
|
@@ -163,26 +170,26 @@ const wangzhi = import.meta.env.VITE_APP_BASE_API;
|
|
|
const isAlive = ref(true);
|
|
const isAlive = ref(true);
|
|
|
//--------tabs-----------------
|
|
//--------tabs-----------------
|
|
|
let tabIndex = 2;
|
|
let tabIndex = 2;
|
|
|
-const editableTabsValue = ref("2");
|
|
|
|
|
-const editableTabs = ref([]);
|
|
|
|
|
|
|
+const editableTabsValue = ref("/index");
|
|
|
|
|
+const editableTabs = ref([{ label: "会话消息", path: "/index" }]);
|
|
|
|
|
|
|
|
-const removeTab = (targetName) => {
|
|
|
|
|
- const tabs = editableTabs.value;
|
|
|
|
|
- let activeName = editableTabsValue.value;
|
|
|
|
|
- if (activeName === targetName) {
|
|
|
|
|
- tabs.forEach((tab, index) => {
|
|
|
|
|
- if (tab.name === targetName) {
|
|
|
|
|
- const nextTab = tabs[index + 1] || tabs[index - 1];
|
|
|
|
|
- if (nextTab) {
|
|
|
|
|
- activeName = nextTab.name;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- });
|
|
|
|
|
- }
|
|
|
|
|
|
|
+// const removeTab = (targetName) => {
|
|
|
|
|
+// const tabs = editableTabs.value;
|
|
|
|
|
+// let activeName = editableTabsValue.value;
|
|
|
|
|
+// if (activeName === targetName) {
|
|
|
|
|
+// tabs.forEach((tab, index) => {
|
|
|
|
|
+// if (tab.name === targetName) {
|
|
|
|
|
+// const nextTab = tabs[index + 1] || tabs[index - 1];
|
|
|
|
|
+// if (nextTab) {
|
|
|
|
|
+// activeName = nextTab.name;
|
|
|
|
|
+// }
|
|
|
|
|
+// }
|
|
|
|
|
+// });
|
|
|
|
|
+// }
|
|
|
|
|
|
|
|
- editableTabsValue.value = activeName;
|
|
|
|
|
- editableTabs.value = tabs.filter((tab) => tab.name !== targetName);
|
|
|
|
|
-};
|
|
|
|
|
|
|
+// editableTabsValue.value = activeName;
|
|
|
|
|
+// editableTabs.value = tabs.filter((tab) => tab.name !== targetName);
|
|
|
|
|
+// };
|
|
|
//-------------------------
|
|
//-------------------------
|
|
|
|
|
|
|
|
function reload() {
|
|
function reload() {
|
|
@@ -342,14 +349,49 @@ const menuList = reactive({
|
|
|
],
|
|
],
|
|
|
});
|
|
});
|
|
|
const clickPath = (index, items) => {
|
|
const clickPath = (index, items) => {
|
|
|
- console.log("items", items);
|
|
|
|
|
- // clickId.value = index;
|
|
|
|
|
- console.log("editableTabs", editableTabs.value);
|
|
|
|
|
|
|
+ items = toRaw(items);
|
|
|
|
|
+ // console.log("items", items);
|
|
|
|
|
+ // editableTabs.value = arr;
|
|
|
const arr = toRaw(editableTabs.value);
|
|
const arr = toRaw(editableTabs.value);
|
|
|
- console.log("arr", arr);
|
|
|
|
|
- editableTabs.value = arr.push({ label: items.label, path: items.path });
|
|
|
|
|
- console.log("editableTabs", editableTabs.value);
|
|
|
|
|
|
|
+ if (!arr.some((item) => item.label == items.label)) {
|
|
|
|
|
+ editableTabs.value.push({ label: items.label, path: items.path });
|
|
|
|
|
+ //需要jSON去转 否则页面无变化 离谱得很
|
|
|
|
|
+ editableTabs.value = JSON.parse(JSON.stringify(editableTabs.value));
|
|
|
|
|
+ }else{
|
|
|
|
|
+ clickTab(items.path)
|
|
|
|
|
+ }
|
|
|
|
|
+ editableTabsValue.value = items.path
|
|
|
|
|
+ // console.log("editableTabs", editableTabs.value);
|
|
|
};
|
|
};
|
|
|
|
|
+const clickTab = (item) => {
|
|
|
|
|
+ console.log("item", toRaw(item));
|
|
|
|
|
+ let regExp = new RegExp(/^\//)
|
|
|
|
|
+ if (!regExp.test(toRaw(item))) {
|
|
|
|
|
+ const data = JSON.parse(toRaw(item))
|
|
|
|
|
+ console.log('data',data);
|
|
|
|
|
+ router.push({
|
|
|
|
|
+ path: "/fileEdit",
|
|
|
|
|
+ query: {
|
|
|
|
|
+ clickRowId: data.docId,
|
|
|
|
|
+ copyRow: JSON.stringify(data),
|
|
|
|
|
+ },
|
|
|
|
|
+ });
|
|
|
|
|
+ } else {
|
|
|
|
|
+ router.push({
|
|
|
|
|
+ path: item,
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+};
|
|
|
|
|
+//创建tab标签事件
|
|
|
|
|
+const addTab = (data) => {
|
|
|
|
|
+ const arr = toRaw(editableTabs.value);
|
|
|
|
|
+ if (!arr.some((item) => item.label == data.fileName)) {
|
|
|
|
|
+ editableTabs.value.push({ label: data.fileName, path: JSON.stringify(data) });
|
|
|
|
|
+ //需要jSON去转 否则页面无变化 离谱得很
|
|
|
|
|
+ editableTabs.value = JSON.parse(JSON.stringify(editableTabs.value));
|
|
|
|
|
+ }
|
|
|
|
|
+};
|
|
|
|
|
+provide("addTab", addTab);
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
<style lang="scss" scoped>
|
|
@@ -430,6 +472,11 @@ const clickPath = (index, items) => {
|
|
|
border-radius: 4px 4px 4px 4px;
|
|
border-radius: 4px 4px 4px 4px;
|
|
|
background-color: #fff;
|
|
background-color: #fff;
|
|
|
margin-bottom: 8px;
|
|
margin-bottom: 8px;
|
|
|
|
|
+ .demo-tabs {
|
|
|
|
|
+ height: 32px;
|
|
|
|
|
+ // display: flex;
|
|
|
|
|
+ // align-items: center;
|
|
|
|
|
+ }
|
|
|
.tab_pane {
|
|
.tab_pane {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
align-items: center;
|
|
align-items: center;
|
|
@@ -442,15 +489,18 @@ const clickPath = (index, items) => {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
:deep(.demo-tabs .el-tabs__item) {
|
|
:deep(.demo-tabs .el-tabs__item) {
|
|
|
- height: 32px !important;
|
|
|
|
|
|
|
+ height: 24px !important;
|
|
|
padding: 0px 8px !important;
|
|
padding: 0px 8px !important;
|
|
|
|
|
+ margin-top: 4px !important;
|
|
|
|
|
+ margin-left: 4px !important;
|
|
|
|
|
+ border: 1px solid #c1cce3 !important;
|
|
|
color: #505870 !important;
|
|
color: #505870 !important;
|
|
|
font-size: 12px !important;
|
|
font-size: 12px !important;
|
|
|
- line-height: 32px;
|
|
|
|
|
|
|
+ line-height: 24px;
|
|
|
font-weight: 400 !important;
|
|
font-weight: 400 !important;
|
|
|
}
|
|
}
|
|
|
// tag选中颜色
|
|
// tag选中颜色
|
|
|
-:deep( .demo-tabs .el-tabs__item.is-active) {
|
|
|
|
|
|
|
+:deep(.demo-tabs .el-tabs__item.is-active) {
|
|
|
color: #fff !important;
|
|
color: #fff !important;
|
|
|
font-weight: normal;
|
|
font-weight: normal;
|
|
|
background-color: #6f85b5;
|
|
background-color: #6f85b5;
|