fix(menu): fix the calculation error of the top menu width

This commit is contained in:
vben
2020-12-05 16:47:16 +08:00
parent 6da377daa9
commit de1f006284
4 changed files with 70 additions and 28 deletions

View File

@@ -8,6 +8,8 @@ import {
unref,
computed,
ref,
nextTick,
watchEffect,
// nextTick
} from 'vue';
@@ -30,7 +32,7 @@ import { useModal } from '/@/components/Modal';
import { useFullscreen } from '/@/hooks/web/useFullScreen';
import { useTabs } from '/@/hooks/web/useTabs';
// import { useWindowSizeFn } from '/@/hooks/event/useWindowSizeFn';
import { useWindowSizeFn } from '/@/hooks/event/useWindowSizeFn';
import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';
import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
import { useRootSetting } from '/@/hooks/setting/useRootSetting';
@@ -68,9 +70,9 @@ export default defineComponent({
fixed: propTypes.bool,
},
setup(props) {
// let logoEl: Element | null | undefined;
let logoEl: Element | null | undefined;
// const logoWidthRef = ref(200);
const logoWidthRef = ref(200);
const logoRef = ref<ComponentRef>(null);
const injectValue = useLayoutContext();
@@ -78,7 +80,13 @@ export default defineComponent({
const { refreshPage } = useTabs();
const { t } = useI18n();
const { getShowTopMenu, getShowHeaderTrigger, getSplit, getTopMenuAlign } = useMenuSetting();
const {
getShowTopMenu,
getShowHeaderTrigger,
getSplit,
getTopMenuAlign,
getIsHorizontal,
} = useMenuSetting();
const { getShowLocale } = useLocaleSetting();
const { getUseErrorHandle, getShowBreadCrumbIcon } = useRootSetting();
@@ -98,22 +106,13 @@ export default defineComponent({
const [register, { openModal }] = useModal();
const { toggleFullscreen, isFullscreenRef } = useFullscreen();
// useWindowSizeFn(
// () => {
// nextTick(() => {
// if (!unref(getShowTopMenu)) return;
// let width = 0;
// if (!logoEl) {
// logoEl = unref(logoRef)?.$el;
// } else {
// width += logoEl.clientWidth;
// }
// logoWidthRef.value = width + 80;
// });
// },
// 200,
// { immediate: true }
// );
useWindowSizeFn(
() => {
calcTopMenuWidth();
},
100,
{ immediate: false }
);
const headerClass = computed(() => {
const theme = unref(getHeaderTheme);
@@ -132,6 +131,25 @@ export default defineComponent({
return unref(getSplit) ? MenuModeEnum.HORIZONTAL : null;
});
watchEffect(() => {
if (unref(getIsHorizontal)) {
calcTopMenuWidth();
}
});
function calcTopMenuWidth() {
nextTick(() => {
if (!unref(getShowTopMenu)) return;
let width = 0;
if (!logoEl) {
logoEl = unref(logoRef)?.$el;
}
if (!logoEl) return;
width += logoEl.clientWidth;
logoWidthRef.value = width + 80;
});
}
function handleToErrorList() {
push(PageEnum.ERROR_LOG_PAGE).then(() => {
errorStore.commitErrorListCountState(0);
@@ -143,7 +161,7 @@ export default defineComponent({
}
function renderHeaderContent() {
// const width = unref(logoWidthRef);
const width = unref(logoWidthRef);
return (
<div class="layout-header__content ">
{unref(getShowHeaderLogo) && (
@@ -162,8 +180,8 @@ export default defineComponent({
)}
{unref(getShowTopMenu) && unref(isPc) && (
// <div class={[`layout-header__menu `]} style={{ width: `calc(100% - ${width}px)` }}>
<div class={[`layout-header__menu `]}>
<div class={[`layout-header__menu `]} style={{ width: `calc(100% - ${width}px)` }}>
{/* <div class={[`layout-header__menu `]}> */}
<LayoutMenu
isHorizontal={true}
class={`justify-${unref(getTopMenuAlign)}`}