提交 2f12556d 作者: vben

fix: fix the top menu adaptive failure

上级 5737e478
...@@ -18,6 +18,7 @@ ...@@ -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({ ...@@ -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(() => {
......
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( ...@@ -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( ...@@ -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( ...@@ -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({ ...@@ -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'; ...@@ -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 { ...@@ -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 ...@@ -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 ...@@ -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) => {
......
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'; ...@@ -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({ ...@@ -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({ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论