mirror of
https://github.com/vbenjs/vue-vben-admin.git
synced 2025-08-27 19:29:04 +08:00
fix: fix routing switch, tab is not activated
This commit is contained in:
@@ -239,14 +239,13 @@ export default defineComponent({
|
|||||||
) : (
|
) : (
|
||||||
<section class={`basic-menu-wrap`}>
|
<section class={`basic-menu-wrap`}>
|
||||||
{getSlot(slots, 'header')}
|
{getSlot(slots, 'header')}
|
||||||
{props.search && (
|
|
||||||
<SearchInput
|
<SearchInput
|
||||||
|
class={!props.search ? 'hidden' : ''}
|
||||||
theme={props.theme}
|
theme={props.theme}
|
||||||
onChange={handleInputChange}
|
onChange={handleInputChange}
|
||||||
onClick={handleInputClick}
|
onClick={handleInputClick}
|
||||||
collapsed={getCollapsedState}
|
collapsed={getCollapsedState}
|
||||||
/>
|
/>
|
||||||
)}
|
|
||||||
<section style={unref(getMenuWrapStyle)}>
|
<section style={unref(getMenuWrapStyle)}>
|
||||||
<ScrollContainer>{() => renderMenu()}</ScrollContainer>
|
<ScrollContainer>{() => renderMenu()}</ScrollContainer>
|
||||||
</section>
|
</section>
|
||||||
|
@@ -10,6 +10,7 @@ export type RouteLocationRawEx = Omit<RouteLocationRaw, 'path'> & { path: PageEn
|
|||||||
|
|
||||||
function handleError(e: Error) {
|
function handleError(e: Error) {
|
||||||
console.error(e);
|
console.error(e);
|
||||||
|
// 101是为了 大于 打开时候设置的100延时防止闪动
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
appStore.commitPageLoadingState(false);
|
appStore.commitPageLoadingState(false);
|
||||||
}, 101);
|
}, 101);
|
||||||
|
@@ -3,6 +3,9 @@ import { PageEnum } from '/@/enums/pageEnum';
|
|||||||
import { TabItem, tabStore } from '/@/store/modules/tab';
|
import { TabItem, tabStore } from '/@/store/modules/tab';
|
||||||
import { appStore } from '/@/store/modules/app';
|
import { appStore } from '/@/store/modules/app';
|
||||||
import router from '/@/router';
|
import router from '/@/router';
|
||||||
|
import { ref } from 'vue';
|
||||||
|
|
||||||
|
const activeKeyRef = ref<string>('');
|
||||||
|
|
||||||
type Fn = () => void;
|
type Fn = () => void;
|
||||||
type RouteFn = (tabItem: TabItem) => void;
|
type RouteFn = (tabItem: TabItem) => void;
|
||||||
@@ -70,12 +73,13 @@ export function useTabs() {
|
|||||||
closeOther: () => canIUseFn() && closeOther(tabStore.getCurrentTab),
|
closeOther: () => canIUseFn() && closeOther(tabStore.getCurrentTab),
|
||||||
closeCurrent: () => canIUseFn() && closeCurrent(tabStore.getCurrentTab),
|
closeCurrent: () => canIUseFn() && closeCurrent(tabStore.getCurrentTab),
|
||||||
resetCache: () => canIUseFn() && resetCache(),
|
resetCache: () => canIUseFn() && resetCache(),
|
||||||
addTab: (path: PageEnum, goTo = false) => {
|
addTab: (path: PageEnum, goTo = false, replace = false) => {
|
||||||
useTimeout(() => {
|
useTimeout(() => {
|
||||||
tabStore.addTabByPathAction(path);
|
tabStore.addTabByPathAction(path);
|
||||||
}, 0);
|
}, 0);
|
||||||
|
activeKeyRef.value = path;
|
||||||
goTo && router.push(path);
|
goTo && replace ? router.replace : router.push(path);
|
||||||
},
|
},
|
||||||
|
activeKeyRef,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-logo" @click="handleGoHome">
|
<div class="app-logo" @click="handleGoHome">
|
||||||
<img :src="logo" />
|
<img :src="logo" />
|
||||||
<div v-if="show" class="logo-title ml-2 ellipsis">{{ globSetting.title }}</div>
|
<div v-if="show" class="logo-title ml-1 ellipsis">{{ globSetting.title }}</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
@@ -62,7 +62,7 @@
|
|||||||
.logo-title {
|
.logo-title {
|
||||||
display: none;
|
display: none;
|
||||||
font-family: Georgia, serif;
|
font-family: Georgia, serif;
|
||||||
font-size: 18px;
|
font-size: 16px;
|
||||||
.respond-to(medium,{
|
.respond-to(medium,{
|
||||||
display: block;
|
display: block;
|
||||||
});
|
});
|
||||||
|
@@ -193,7 +193,7 @@ export default defineComponent({
|
|||||||
class="layout-menu"
|
class="layout-menu"
|
||||||
theme={themeData}
|
theme={themeData}
|
||||||
showLogo={isShowLogo}
|
showLogo={isShowLogo}
|
||||||
search={unref(showSearchRef)}
|
search={unref(showSearchRef) && !collapsed}
|
||||||
items={unref(menusRef)}
|
items={unref(menusRef)}
|
||||||
flatItems={unref(flatMenusRef)}
|
flatItems={unref(flatMenusRef)}
|
||||||
onClickSearchInput={handleClickSearchInput}
|
onClickSearchInput={handleClickSearchInput}
|
||||||
|
@@ -48,7 +48,7 @@
|
|||||||
.layout-menu {
|
.layout-menu {
|
||||||
&__logo {
|
&__logo {
|
||||||
height: @header-height;
|
height: @header-height;
|
||||||
padding: 10px;
|
padding: 10px 4px;
|
||||||
|
|
||||||
img {
|
img {
|
||||||
width: @logo-width;
|
width: @logo-width;
|
||||||
|
@@ -2,7 +2,14 @@ import type { TabContentProps } from './tab.data';
|
|||||||
import type { TabItem } from '/@/store/modules/tab';
|
import type { TabItem } from '/@/store/modules/tab';
|
||||||
import type { AppRouteRecordRaw } from '/@/router/types';
|
import type { AppRouteRecordRaw } from '/@/router/types';
|
||||||
|
|
||||||
import { defineComponent, watch, computed, ref, unref, onMounted } from 'vue';
|
import {
|
||||||
|
defineComponent,
|
||||||
|
watch,
|
||||||
|
computed,
|
||||||
|
// ref,
|
||||||
|
unref,
|
||||||
|
onMounted,
|
||||||
|
} from 'vue';
|
||||||
import { Tabs } from 'ant-design-vue';
|
import { Tabs } from 'ant-design-vue';
|
||||||
import TabContent from './TabContent';
|
import TabContent from './TabContent';
|
||||||
|
|
||||||
@@ -12,41 +19,43 @@ import { TabContentEnum } from './tab.data';
|
|||||||
|
|
||||||
import { useRouter } from 'vue-router';
|
import { useRouter } from 'vue-router';
|
||||||
|
|
||||||
import './index.less';
|
|
||||||
import { tabStore } from '/@/store/modules/tab';
|
import { tabStore } from '/@/store/modules/tab';
|
||||||
import { closeTab } from './useTabDropdown';
|
import { closeTab } from './useTabDropdown';
|
||||||
import router from '/@/router';
|
import router from '/@/router';
|
||||||
import { useTabs } from '/@/hooks/web/useTabs';
|
import { useTabs } from '/@/hooks/web/useTabs';
|
||||||
import { PageEnum } from '/@/enums/pageEnum';
|
import { PageEnum } from '/@/enums/pageEnum';
|
||||||
|
|
||||||
|
import './index.less';
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'MultiTabs',
|
name: 'MultiTabs',
|
||||||
setup() {
|
setup() {
|
||||||
let isAddAffix = false;
|
let isAddAffix = false;
|
||||||
const go = useGo();
|
const go = useGo();
|
||||||
const { currentRoute } = useRouter();
|
const { currentRoute } = useRouter();
|
||||||
|
const { addTab, activeKeyRef } = useTabs();
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
const { addTab } = useTabs();
|
|
||||||
addTab(unref(currentRoute).path as PageEnum);
|
addTab(unref(currentRoute).path as PageEnum);
|
||||||
});
|
});
|
||||||
|
|
||||||
// 当前激活tab
|
// 当前激活tab
|
||||||
const activeKeyRef = ref<string>('');
|
// const activeKeyRef = ref<string>('');
|
||||||
|
|
||||||
// 当前tab列表
|
// 当前tab列表
|
||||||
const getTabsState = computed(() => {
|
const getTabsState = computed(() => {
|
||||||
return tabStore.getTabsState;
|
return tabStore.getTabsState;
|
||||||
});
|
});
|
||||||
|
|
||||||
watch(
|
|
||||||
() => unref(currentRoute).path,
|
|
||||||
(path) => {
|
|
||||||
if (!isAddAffix) {
|
if (!isAddAffix) {
|
||||||
addAffixTabs();
|
addAffixTabs();
|
||||||
isAddAffix = true;
|
isAddAffix = true;
|
||||||
}
|
}
|
||||||
activeKeyRef.value = path;
|
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => unref(currentRoute).path,
|
||||||
|
(path) => {
|
||||||
|
if (activeKeyRef.value !== path) {
|
||||||
|
activeKeyRef.value = path;
|
||||||
|
}
|
||||||
// 监听路由的话虽然可以,但是路由切换的时间会造成卡顿现象?
|
// 监听路由的话虽然可以,但是路由切换的时间会造成卡顿现象?
|
||||||
// 使用useTab的addTab的话,当用户手动调转,需要自行调用addTab
|
// 使用useTab的addTab的话,当用户手动调转,需要自行调用addTab
|
||||||
// tabStore.commitAddTab((unref(currentRoute) as unknown) as AppRouteRecordRaw);
|
// tabStore.commitAddTab((unref(currentRoute) as unknown) as AppRouteRecordRaw);
|
||||||
@@ -55,6 +64,7 @@ export default defineComponent({
|
|||||||
immediate: true,
|
immediate: true,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description: 过滤所有固定路由
|
* @description: 过滤所有固定路由
|
||||||
*/
|
*/
|
||||||
@@ -72,6 +82,7 @@ export default defineComponent({
|
|||||||
});
|
});
|
||||||
return tabs;
|
return tabs;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description: 设置固定tabs
|
* @description: 设置固定tabs
|
||||||
*/
|
*/
|
||||||
@@ -87,6 +98,7 @@ export default defineComponent({
|
|||||||
activeKeyRef.value = activeKey;
|
activeKeyRef.value = activeKey;
|
||||||
go(activeKey, false);
|
go(activeKey, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 关闭当前ab
|
// 关闭当前ab
|
||||||
function handleEdit(targetKey: string) {
|
function handleEdit(targetKey: string) {
|
||||||
// 新增操作隐藏,目前只使用删除操作
|
// 新增操作隐藏,目前只使用删除操作
|
||||||
|
@@ -51,7 +51,7 @@ const setting: ProjectConfig = {
|
|||||||
// 是否显示搜索框
|
// 是否显示搜索框
|
||||||
showSearch: true,
|
showSearch: true,
|
||||||
// 菜单宽度
|
// 菜单宽度
|
||||||
menuWidth: 200,
|
menuWidth: 180,
|
||||||
// 菜单模式
|
// 菜单模式
|
||||||
mode: MenuModeEnum.INLINE,
|
mode: MenuModeEnum.INLINE,
|
||||||
// 菜单类型
|
// 菜单类型
|
||||||
|
Reference in New Issue
Block a user