fix: fix the disappearance of tab switching parameters (#56)
This commit is contained in:
parent
c620f8279f
commit
6bffdb5c64
|
|
@ -22,12 +22,13 @@ import { useModal } from '/@/components/Modal/index';
|
||||||
import { errorStore } from '/@/store/modules/error';
|
import { errorStore } from '/@/store/modules/error';
|
||||||
import { useWindowSizeFn } from '/@/hooks/event/useWindowSize';
|
import { useWindowSizeFn } from '/@/hooks/event/useWindowSize';
|
||||||
import NoticeAction from './actions/notice/NoticeActionItem.vue';
|
import NoticeAction from './actions/notice/NoticeActionItem.vue';
|
||||||
|
import { useRouter } from 'vue-router';
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'DefaultLayoutHeader',
|
name: 'DefaultLayoutHeader',
|
||||||
setup() {
|
setup() {
|
||||||
const widthRef = ref(200);
|
const widthRef = ref(200);
|
||||||
const { refreshPage, addTab } = useTabs();
|
const { refreshPage } = useTabs();
|
||||||
|
const { push } = useRouter();
|
||||||
const [register, { openModal }] = useModal();
|
const [register, { openModal }] = useModal();
|
||||||
const { toggleFullscreen, isFullscreenRef } = useFullscreen();
|
const { toggleFullscreen, isFullscreenRef } = useFullscreen();
|
||||||
|
|
||||||
|
|
@ -70,7 +71,7 @@ export default defineComponent({
|
||||||
|
|
||||||
function handleToErrorList() {
|
function handleToErrorList() {
|
||||||
errorStore.commitErrorListCountState(0);
|
errorStore.commitErrorListCountState(0);
|
||||||
addTab('/exception/error-log', true);
|
push('/exception/error-log');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -22,8 +22,8 @@ import {
|
||||||
import { useRouter } from 'vue-router';
|
import { useRouter } from 'vue-router';
|
||||||
import { useThrottle } from '/@/hooks/core/useThrottle';
|
import { useThrottle } from '/@/hooks/core/useThrottle';
|
||||||
import { permissionStore } from '/@/store/modules/permission';
|
import { permissionStore } from '/@/store/modules/permission';
|
||||||
import { useTabs } from '/@/hooks/web/useTabs';
|
// import { useTabs } from '/@/hooks/web/useTabs';
|
||||||
import { PageEnum } from '/@/enums/pageEnum';
|
// import { PageEnum } from '/@/enums/pageEnum';
|
||||||
|
|
||||||
// import
|
// import
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
|
|
@ -53,8 +53,8 @@ export default defineComponent({
|
||||||
setup(props) {
|
setup(props) {
|
||||||
const menusRef = ref<Menu[]>([]);
|
const menusRef = ref<Menu[]>([]);
|
||||||
const flatMenusRef = ref<Menu[]>([]);
|
const flatMenusRef = ref<Menu[]>([]);
|
||||||
const { currentRoute } = useRouter();
|
const { currentRoute, push } = useRouter();
|
||||||
const { addTab } = useTabs();
|
// const { addTab } = useTabs();
|
||||||
|
|
||||||
const getProjectConfigRef = computed(() => {
|
const getProjectConfigRef = computed(() => {
|
||||||
return appStore.getProjectConfig;
|
return appStore.getProjectConfig;
|
||||||
|
|
@ -144,7 +144,8 @@ export default defineComponent({
|
||||||
if (splitType === MenuSplitTyeEnum.TOP) {
|
if (splitType === MenuSplitTyeEnum.TOP) {
|
||||||
menuStore.commitCurrentTopSplitMenuPathState(path);
|
menuStore.commitCurrentTopSplitMenuPathState(path);
|
||||||
}
|
}
|
||||||
addTab(path as PageEnum, true);
|
push(path);
|
||||||
|
// addTab(path as PageEnum, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,7 @@ import { useTabs } from '/@/hooks/web/useTabs';
|
||||||
// import { PageEnum } from '/@/enums/pageEnum';
|
// import { PageEnum } from '/@/enums/pageEnum';
|
||||||
|
|
||||||
import './index.less';
|
import './index.less';
|
||||||
|
import { userStore } from '/@/store/modules/user';
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'MultiTabs',
|
name: 'MultiTabs',
|
||||||
setup() {
|
setup() {
|
||||||
|
|
@ -60,24 +61,27 @@ export default defineComponent({
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
() => unref(currentRoute).path,
|
() => unref(currentRoute).path,
|
||||||
(path) => {
|
() => {
|
||||||
if (activeKeyRef.value !== path) {
|
if (!userStore.getTokenState) return;
|
||||||
activeKeyRef.value = path;
|
const { path: rPath, fullPath } = unref(currentRoute);
|
||||||
|
if (activeKeyRef.value !== (fullPath || rPath)) {
|
||||||
|
activeKeyRef.value = fullPath || rPath;
|
||||||
}
|
}
|
||||||
// 监听路由的话虽然可以,但是路由切换的时间会造成卡顿现象?
|
// 监听路由的话虽然可以,但是路由切换的时间会造成卡顿现象?
|
||||||
// 使用useTab的addTab的话,当用户手动调转,需要自行调用addTab
|
// 使用useTab的addTab的话,当用户手动调转,需要自行调用addTab
|
||||||
// tabStore.commitAddTab((unref(currentRoute) as unknown) as AppRouteRecordRaw);
|
tabStore.commitAddTab((unref(currentRoute) as unknown) as AppRouteRecordRaw);
|
||||||
const { affix } = currentRoute.value.meta || {};
|
|
||||||
if (affix) return;
|
// const { affix } = currentRoute.value.meta || {};
|
||||||
const hasInTab = tabStore.getTabsState.some(
|
// if (affix) return;
|
||||||
(item) => item.fullPath === currentRoute.value.fullPath
|
// const hasInTab = tabStore.getTabsState.some(
|
||||||
);
|
// (item) => item.fullPath === currentRoute.value.fullPath
|
||||||
if (!hasInTab) {
|
// );
|
||||||
tabStore.commitAddTab((unref(currentRoute) as unknown) as AppRouteRecordRaw);
|
// if (!hasInTab) {
|
||||||
}
|
// tabStore.commitAddTab((unref(currentRoute) as unknown) as AppRouteRecordRaw);
|
||||||
|
// }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
flush: 'post',
|
// flush: 'post',
|
||||||
immediate: true,
|
immediate: true,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
@ -115,7 +119,9 @@ export default defineComponent({
|
||||||
// 关闭当前ab
|
// 关闭当前ab
|
||||||
function handleEdit(targetKey: string) {
|
function handleEdit(targetKey: string) {
|
||||||
// 新增操作隐藏,目前只使用删除操作
|
// 新增操作隐藏,目前只使用删除操作
|
||||||
const index = unref(getTabsState).findIndex((item) => item.path === targetKey);
|
const index = unref(getTabsState).findIndex(
|
||||||
|
(item) => (item.fullPath || item.path) === targetKey
|
||||||
|
);
|
||||||
index !== -1 && closeTab(unref(getTabsState)[index]);
|
index !== -1 && closeTab(unref(getTabsState)[index]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -133,8 +139,10 @@ export default defineComponent({
|
||||||
}
|
}
|
||||||
function renderTabs() {
|
function renderTabs() {
|
||||||
return unref(getTabsState).map((item: TabItem) => {
|
return unref(getTabsState).map((item: TabItem) => {
|
||||||
|
const key = item.query ? item.fullPath : item.path;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Tabs.TabPane key={item.path} closable={!(item && item.meta && item.meta.affix)}>
|
<Tabs.TabPane key={key} closable={!(item && item.meta && item.meta.affix)}>
|
||||||
{{
|
{{
|
||||||
tab: () => <TabContent tabItem={item} />,
|
tab: () => <TabContent tabItem={item} />,
|
||||||
}}
|
}}
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ import { PageEnum } from '/@/enums/pageEnum';
|
||||||
import { useGo, useRedo } from '/@/hooks/web/usePage';
|
import { useGo, useRedo } from '/@/hooks/web/usePage';
|
||||||
import router from '/@/router';
|
import router from '/@/router';
|
||||||
import { useTabs, isInitUseTab } from '/@/hooks/web/useTabs';
|
import { useTabs, isInitUseTab } from '/@/hooks/web/useTabs';
|
||||||
|
import { RouteLocationRaw } from 'vue-router';
|
||||||
|
|
||||||
const { initTabFn } = useTabs();
|
const { initTabFn } = useTabs();
|
||||||
/**
|
/**
|
||||||
|
|
@ -92,7 +93,11 @@ export function useTabDropdown(tabContentProps: TabContentProps) {
|
||||||
let toPath: PageEnum | string = PageEnum.BASE_HOME;
|
let toPath: PageEnum | string = PageEnum.BASE_HOME;
|
||||||
|
|
||||||
if (len > 0) {
|
if (len > 0) {
|
||||||
toPath = unref(getTabsState)[len - 1].path;
|
const page = unref(getTabsState)[len - 1];
|
||||||
|
const p = page.fullPath || page.path;
|
||||||
|
if (p) {
|
||||||
|
toPath = p;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// 跳到当前页面报错
|
// 跳到当前页面报错
|
||||||
path !== toPath && go(toPath as PageEnum, true);
|
path !== toPath && go(toPath as PageEnum, true);
|
||||||
|
|
@ -192,7 +197,7 @@ export function useTabDropdown(tabContentProps: TabContentProps) {
|
||||||
}
|
}
|
||||||
return { getDropMenuList, handleMenuEvent };
|
return { getDropMenuList, handleMenuEvent };
|
||||||
}
|
}
|
||||||
export function closeTab(closedTab: TabItem) {
|
export function closeTab(closedTab: TabItem | AppRouteRecordRaw) {
|
||||||
const { currentRoute, replace } = router;
|
const { currentRoute, replace } = router;
|
||||||
// 当前tab列表
|
// 当前tab列表
|
||||||
const getTabsState = computed(() => {
|
const getTabsState = computed(() => {
|
||||||
|
|
@ -205,23 +210,35 @@ export function closeTab(closedTab: TabItem) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// 关闭的为激活atb
|
// 关闭的为激活atb
|
||||||
let toPath: PageEnum | string;
|
let toObj: RouteLocationRaw = {};
|
||||||
const index = unref(getTabsState).findIndex((item) => item.path === path);
|
const index = unref(getTabsState).findIndex((item) => item.path === path);
|
||||||
|
|
||||||
// 如果当前为最左边tab
|
// 如果当前为最左边tab
|
||||||
if (index === 0) {
|
if (index === 0) {
|
||||||
// 只有一个tab,则跳转至首页,否则跳转至右tab
|
// 只有一个tab,则跳转至首页,否则跳转至右tab
|
||||||
if (unref(getTabsState).length === 1) {
|
if (unref(getTabsState).length === 1) {
|
||||||
toPath = PageEnum.BASE_HOME;
|
toObj = PageEnum.BASE_HOME;
|
||||||
} else {
|
} else {
|
||||||
// 跳转至右边tab
|
// 跳转至右边tab
|
||||||
toPath = unref(getTabsState)[index + 1].path;
|
const page = unref(getTabsState)[index + 1];
|
||||||
|
const { params, path, query } = page;
|
||||||
|
toObj = {
|
||||||
|
params,
|
||||||
|
path,
|
||||||
|
query,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 跳转至左边tab
|
// 跳转至左边tab
|
||||||
toPath = unref(getTabsState)[index - 1].path;
|
const page = unref(getTabsState)[index - 1];
|
||||||
|
const { params, path, query } = page;
|
||||||
|
toObj = {
|
||||||
|
params,
|
||||||
|
path,
|
||||||
|
query,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
const route = (unref(currentRoute) as unknown) as AppRouteRecordRaw;
|
const route = (unref(currentRoute) as unknown) as AppRouteRecordRaw;
|
||||||
tabStore.commitCloseTab(route);
|
tabStore.commitCloseTab(route);
|
||||||
replace(toPath);
|
replace(toObj);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -98,11 +98,21 @@ class Tab extends VuexModule {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let updateIndex = -1;
|
||||||
// 已经存在的页面,不重复添加tab
|
// 已经存在的页面,不重复添加tab
|
||||||
const hasTab = this.tabsState.some((tab) => {
|
const hasTab = this.tabsState.some((tab, index) => {
|
||||||
return tab.fullPath === fullPath;
|
updateIndex = index;
|
||||||
|
return (tab.fullPath || tab.path) === (fullPath || path);
|
||||||
});
|
});
|
||||||
if (hasTab) return;
|
if (hasTab) {
|
||||||
|
const curTab = toRaw(this.tabsState)[updateIndex];
|
||||||
|
if (!curTab) return;
|
||||||
|
curTab.params = params || curTab.params;
|
||||||
|
curTab.query = query || curTab.query;
|
||||||
|
curTab.fullPath = fullPath || curTab.fullPath;
|
||||||
|
this.tabsState.splice(updateIndex, 1, curTab);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this.tabsState.push({ path, fullPath, name, meta, params, query });
|
this.tabsState.push({ path, fullPath, name, meta, params, query });
|
||||||
if (unref(getOpenKeepAliveRef) && name) {
|
if (unref(getOpenKeepAliveRef) && name) {
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="p-4">
|
<div class="p-4">
|
||||||
Current Param : {{ params }}
|
Current Param : {{ params }}
|
||||||
<input />
|
<!-- <input /> -->
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue