mirror of
https://github.com/vbenjs/vue-vben-admin.git
synced 2025-08-27 19:29:04 +08:00
fix: fix the top menu adaptive failure
This commit is contained in:
@@ -18,6 +18,7 @@
|
|||||||
import { useSetting } from '/@/hooks/core/useSetting';
|
import { useSetting } from '/@/hooks/core/useSetting';
|
||||||
|
|
||||||
moment.locale('zh-cn');
|
moment.locale('zh-cn');
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'App',
|
name: 'App',
|
||||||
components: { ConfigProvider },
|
components: { ConfigProvider },
|
||||||
|
@@ -45,7 +45,8 @@ export default defineComponent({
|
|||||||
menuState,
|
menuState,
|
||||||
toRef(props, 'items'),
|
toRef(props, 'items'),
|
||||||
toRef(props, 'flatItems'),
|
toRef(props, 'flatItems'),
|
||||||
toRef(props, 'isAppMenu')
|
toRef(props, 'isAppMenu'),
|
||||||
|
toRef(props, 'mode')
|
||||||
);
|
);
|
||||||
|
|
||||||
const getOpenKeys = computed(() => {
|
const getOpenKeys = computed(() => {
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
|
import { MenuModeEnum } from '/@/enums/menuEnum';
|
||||||
import type { Menu as MenuType } from '/@/router/types';
|
import type { Menu as MenuType } from '/@/router/types';
|
||||||
import type { MenuState } from './types';
|
import type { MenuState } from './types';
|
||||||
import type { Ref } from 'vue';
|
import type { Ref } from 'vue';
|
||||||
@@ -10,7 +11,8 @@ export function useOpenKeys(
|
|||||||
menuState: MenuState,
|
menuState: MenuState,
|
||||||
menus: Ref<MenuType[]>,
|
menus: Ref<MenuType[]>,
|
||||||
flatMenusRef: Ref<MenuType[]>,
|
flatMenusRef: Ref<MenuType[]>,
|
||||||
isAppMenu: Ref<boolean>
|
isAppMenu: Ref<boolean>,
|
||||||
|
mode: Ref<MenuModeEnum>
|
||||||
) {
|
) {
|
||||||
/**
|
/**
|
||||||
* @description:设置展开
|
* @description:设置展开
|
||||||
@@ -28,6 +30,9 @@ export function useOpenKeys(
|
|||||||
}
|
}
|
||||||
|
|
||||||
function handleOpenChange(openKeys: string[]) {
|
function handleOpenChange(openKeys: string[]) {
|
||||||
|
if (unref(mode) === MenuModeEnum.HORIZONTAL) {
|
||||||
|
menuState.openKeys = openKeys;
|
||||||
|
} else {
|
||||||
const rootSubMenuKeys: string[] = [];
|
const rootSubMenuKeys: string[] = [];
|
||||||
for (const { children, path } of unref(menus)) {
|
for (const { children, path } of unref(menus)) {
|
||||||
if (children && children.length > 0) {
|
if (children && children.length > 0) {
|
||||||
@@ -45,5 +50,6 @@ export function useOpenKeys(
|
|||||||
menuState.collapsedOpenKeys = openKeys;
|
menuState.collapsedOpenKeys = openKeys;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return { setOpenKeys, resetKeys, handleOpenChange };
|
return { setOpenKeys, resetKeys, handleOpenChange };
|
||||||
}
|
}
|
||||||
|
@@ -217,7 +217,11 @@ export default defineComponent({
|
|||||||
const uuid = buildUUID();
|
const uuid = buildUUID();
|
||||||
emit('register', modalMethods, uuid);
|
emit('register', modalMethods, uuid);
|
||||||
return () => (
|
return () => (
|
||||||
<Modal onCancel={handleCancel} {...{ ...attrs, ...props, ...unref(getProps) }}>
|
<Modal
|
||||||
|
onCancel={handleCancel}
|
||||||
|
{...{ ...attrs, ...props, ...unref(getProps) }}
|
||||||
|
getContainer={() => document.querySelector('.default-layout__main')}
|
||||||
|
>
|
||||||
{{
|
{{
|
||||||
...extendSlots(slots, ['default']),
|
...extendSlots(slots, ['default']),
|
||||||
default: () => renderContent(),
|
default: () => renderContent(),
|
||||||
|
@@ -4,6 +4,7 @@ import { tryOnMounted, tryOnUnmounted } from '/@/utils/helper/vueHelper';
|
|||||||
import { ref } from 'vue';
|
import { ref } from 'vue';
|
||||||
|
|
||||||
import { useDebounce } from '/@/hooks/core/useDebounce';
|
import { useDebounce } from '/@/hooks/core/useDebounce';
|
||||||
|
import { CancelFn } from '../core/types';
|
||||||
|
|
||||||
interface WindowSizeOptions {
|
interface WindowSizeOptions {
|
||||||
once?: boolean;
|
once?: boolean;
|
||||||
@@ -11,7 +12,7 @@ interface WindowSizeOptions {
|
|||||||
listenerOptions?: AddEventListenerOptions | boolean;
|
listenerOptions?: AddEventListenerOptions | boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function useWindowSizeFn<T>(fn: Fn<T>, wait = 150, options?: WindowSizeOptions): void {
|
export function useWindowSizeFn<T>(fn: Fn<T>, wait = 150, options?: WindowSizeOptions): CancelFn {
|
||||||
let handler = () => {
|
let handler = () => {
|
||||||
fn();
|
fn();
|
||||||
};
|
};
|
||||||
@@ -19,6 +20,9 @@ export function useWindowSizeFn<T>(fn: Fn<T>, wait = 150, options?: WindowSizeOp
|
|||||||
handler = handleSize;
|
handler = handleSize;
|
||||||
|
|
||||||
tryOnMounted(() => {
|
tryOnMounted(() => {
|
||||||
|
if (options && options.immediate) {
|
||||||
|
handler();
|
||||||
|
}
|
||||||
window.addEventListener('resize', handler);
|
window.addEventListener('resize', handler);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -26,6 +30,7 @@ export function useWindowSizeFn<T>(fn: Fn<T>, wait = 150, options?: WindowSizeOp
|
|||||||
window.removeEventListener('resize', handler);
|
window.removeEventListener('resize', handler);
|
||||||
cancel();
|
cancel();
|
||||||
});
|
});
|
||||||
|
return cancel;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const useWindowSize = (wait = 150, options?: WindowSizeOptions) => {
|
export const useWindowSize = (wait = 150, options?: WindowSizeOptions) => {
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { defineComponent, unref, computed } from 'vue';
|
import { defineComponent, unref, computed, ref } from 'vue';
|
||||||
import { Layout, Tooltip, Badge } from 'ant-design-vue';
|
import { Layout, Tooltip, Badge } from 'ant-design-vue';
|
||||||
import Logo from '/@/layouts/Logo.vue';
|
import Logo from '/@/layouts/Logo.vue';
|
||||||
import UserDropdown from './UserDropdown';
|
import UserDropdown from './UserDropdown';
|
||||||
@@ -21,17 +21,44 @@ import LockAction from './actions/LockActionItem';
|
|||||||
import { useModal } from '/@/components/Modal/index';
|
import { useModal } from '/@/components/Modal/index';
|
||||||
import { errorStore } from '/@/store/modules/error';
|
import { errorStore } from '/@/store/modules/error';
|
||||||
import { useGo } from '/@/hooks/web/usePage';
|
import { useGo } from '/@/hooks/web/usePage';
|
||||||
|
import { useWindowSizeFn } from '/@/hooks/event/useWindowSize';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'DefaultLayoutHeader',
|
name: 'DefaultLayoutHeader',
|
||||||
setup() {
|
setup() {
|
||||||
|
const widthRef = ref(200);
|
||||||
const { refreshPage } = useTabs();
|
const { refreshPage } = useTabs();
|
||||||
const [register, { openModal }] = useModal();
|
const [register, { openModal }] = useModal();
|
||||||
const { toggleFullscreen, isFullscreenRef } = useFullscreen();
|
const { toggleFullscreen, isFullscreenRef } = useFullscreen();
|
||||||
|
|
||||||
const go = useGo();
|
const go = useGo();
|
||||||
const getProjectConfigRef = computed(() => {
|
const getProjectConfigRef = computed(() => {
|
||||||
return appStore.getProjectConfig;
|
return appStore.getProjectConfig;
|
||||||
});
|
});
|
||||||
|
const showTopMenu = computed(() => {
|
||||||
|
const getProjectConfig = unref(getProjectConfigRef);
|
||||||
|
const {
|
||||||
|
menuSetting: { mode, split: splitMenu },
|
||||||
|
} = getProjectConfig;
|
||||||
|
return mode === MenuModeEnum.HORIZONTAL || splitMenu;
|
||||||
|
});
|
||||||
|
|
||||||
|
let logoEl: Element | null;
|
||||||
|
useWindowSizeFn(
|
||||||
|
() => {
|
||||||
|
if (!unref(showTopMenu)) return;
|
||||||
|
let width = 0;
|
||||||
|
if (!logoEl) {
|
||||||
|
logoEl = document.querySelector('.layout-header__logo');
|
||||||
|
}
|
||||||
|
if (logoEl) {
|
||||||
|
width += logoEl.clientWidth;
|
||||||
|
}
|
||||||
|
widthRef.value = width + 60;
|
||||||
|
},
|
||||||
|
200,
|
||||||
|
{ immediate: true }
|
||||||
|
);
|
||||||
|
|
||||||
function goToGithub() {
|
function goToGithub() {
|
||||||
window.open(GITHUB_URL, '__blank');
|
window.open(GITHUB_URL, '__blank');
|
||||||
@@ -64,6 +91,7 @@ export default defineComponent({
|
|||||||
} = getProjectConfig;
|
} = getProjectConfig;
|
||||||
|
|
||||||
const isSidebarType = menuType === MenuTypeEnum.SIDEBAR;
|
const isSidebarType = menuType === MenuTypeEnum.SIDEBAR;
|
||||||
|
const width = unref(widthRef);
|
||||||
return (
|
return (
|
||||||
<Layout.Header class={['layout-header', 'flex p-0 px-4 ', unref(headerClass)]}>
|
<Layout.Header class={['layout-header', 'flex p-0 px-4 ', unref(headerClass)]}>
|
||||||
{() => (
|
{() => (
|
||||||
@@ -74,8 +102,11 @@ export default defineComponent({
|
|||||||
{mode !== MenuModeEnum.HORIZONTAL && showBreadCrumb && !splitMenu && (
|
{mode !== MenuModeEnum.HORIZONTAL && showBreadCrumb && !splitMenu && (
|
||||||
<LayoutBreadcrumb />
|
<LayoutBreadcrumb />
|
||||||
)}
|
)}
|
||||||
{(mode === MenuModeEnum.HORIZONTAL || splitMenu) && (
|
{unref(showTopMenu) && (
|
||||||
<div class={[`layout-header__menu `, `justify-${topMenuAlign}`]}>
|
<div
|
||||||
|
class={[`layout-header__menu `, `justify-${topMenuAlign}`]}
|
||||||
|
style={{ width: `calc(100% - ${unref(width)}px)` }}
|
||||||
|
>
|
||||||
<LayoutMenu
|
<LayoutMenu
|
||||||
theme={headerTheme}
|
theme={headerTheme}
|
||||||
splitType={splitMenu ? MenuSplitTyeEnum.TOP : MenuSplitTyeEnum.NONE}
|
splitType={splitMenu ? MenuSplitTyeEnum.TOP : MenuSplitTyeEnum.NONE}
|
||||||
|
@@ -206,7 +206,7 @@
|
|||||||
&__content {
|
&__content {
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
// justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -346,11 +346,11 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
&__menu {
|
&__menu {
|
||||||
display: flex;
|
// display: flex;
|
||||||
margin-left: 20px;
|
margin-left: 20px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
flex-grow: 1;
|
// flex-grow: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
&__user-dropdown {
|
&__user-dropdown {
|
||||||
|
Reference in New Issue
Block a user