提交 de25557f 作者: vben

fix(menu): fix scrillbar not work

上级 689425e4
## Wip
### 🐛 Bug Fixes
- 修复混合模式下滚动条丢失问题
## 2.0.0-rc.14 (2020-12-15) ## 2.0.0-rc.14 (2020-12-15)
### ✨ Features ### ✨ Features
......
...@@ -90,9 +90,10 @@ ...@@ -90,9 +90,10 @@
}); });
const getMenuClass = computed(() => { const getMenuClass = computed(() => {
const align = props.isHorizontal && unref(getSplit) ? 'start' : unref(getTopMenuAlign);
return [ return [
prefixCls, prefixCls,
`justify-${unref(getTopMenuAlign)}`, `justify-${align}`,
{ {
[`${prefixCls}--hide-title`]: !unref(showTitle), [`${prefixCls}--hide-title`]: !unref(showTitle),
[`${prefixCls}--collapsed-show-title`]: props.collapsedShowTitle, [`${prefixCls}--collapsed-show-title`]: props.collapsedShowTitle,
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
v-if="getShowHeaderLogo || getIsMobile" v-if="getShowHeaderLogo || getIsMobile"
:class="`${prefixCls}-logo`" :class="`${prefixCls}-logo`"
:theme="getHeaderTheme" :theme="getHeaderTheme"
:style="getLogoWidth"
/> />
<LayoutTrigger <LayoutTrigger
v-if="(getShowContent && getShowHeaderTrigger && !getSplit) || getIsMobile" v-if="(getShowContent && getShowHeaderTrigger && !getSplit) || getIsMobile"
...@@ -103,7 +104,13 @@ ...@@ -103,7 +104,13 @@
}, },
setup(props) { setup(props) {
const { prefixCls } = useDesign('layout-header'); const { prefixCls } = useDesign('layout-header');
const { getShowTopMenu, getShowHeaderTrigger, getSplit } = useMenuSetting(); const {
getShowTopMenu,
getShowHeaderTrigger,
getSplit,
getIsMixMode,
getMenuWidth,
} = useMenuSetting();
const { getShowLocale } = useLocaleSetting(); const { getShowLocale } = useLocaleSetting();
const { getUseErrorHandle } = useRootSetting(); const { getUseErrorHandle } = useRootSetting();
...@@ -131,6 +138,14 @@ ...@@ -131,6 +138,14 @@
]; ];
}); });
const getLogoWidth = computed(() => {
if (!unref(getIsMixMode)) {
return {};
}
const width = unref(getMenuWidth) < 180 ? 180 : unref(getMenuWidth);
return { width: `${width}px` };
});
const getSplitType = computed(() => { const getSplitType = computed(() => {
return unref(getSplit) ? MenuSplitTyeEnum.TOP : MenuSplitTyeEnum.NONE; return unref(getSplit) ? MenuSplitTyeEnum.TOP : MenuSplitTyeEnum.NONE;
}); });
...@@ -157,6 +172,7 @@ ...@@ -157,6 +172,7 @@
getShowNotice, getShowNotice,
getUseLockPage, getUseLockPage,
getUseErrorHandle, getUseErrorHandle,
getLogoWidth,
}; };
}, },
}); });
......
...@@ -47,6 +47,7 @@ export default defineComponent({ ...@@ -47,6 +47,7 @@ export default defineComponent({
getMenuTheme, getMenuTheme,
getCollapsed, getCollapsed,
getAccordion, getAccordion,
getIsHorizontal,
getIsSidebarType, getIsSidebarType,
} = useMenuSetting(); } = useMenuSetting();
const { getShowLogo } = useRootSetting(); const { getShowLogo } = useRootSetting();
...@@ -66,7 +67,12 @@ export default defineComponent({ ...@@ -66,7 +67,12 @@ export default defineComponent({
const getIsShowLogo = computed(() => unref(getShowLogo) && unref(getIsSidebarType)); const getIsShowLogo = computed(() => unref(getShowLogo) && unref(getIsSidebarType));
const getUseScroll = computed(() => { const getUseScroll = computed(() => {
return unref(getIsSidebarType) || props.splitType === MenuSplitTyeEnum.LEFT; return (
!unref(getIsHorizontal) &&
(unref(getIsSidebarType) ||
props.splitType === MenuSplitTyeEnum.LEFT ||
props.splitType === MenuSplitTyeEnum.NONE)
);
}); });
const getWrapperStyle = computed( const getWrapperStyle = computed(
......
...@@ -10,7 +10,7 @@ import { ...@@ -10,7 +10,7 @@ import {
InputNumberItem, InputNumberItem,
} from './components'; } from './components';
import { MenuTypeEnum } from '/@/enums/menuEnum'; import { MenuTypeEnum, TriggerEnum } from '/@/enums/menuEnum';
import { useRootSetting } from '/@/hooks/setting/useRootSetting'; import { useRootSetting } from '/@/hooks/setting/useRootSetting';
import { useMenuSetting } from '/@/hooks/setting/useMenuSetting'; import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
...@@ -25,7 +25,7 @@ import { ...@@ -25,7 +25,7 @@ import {
HandlerEnum, HandlerEnum,
contentModeOptions, contentModeOptions,
topMenuAlignOptions, topMenuAlignOptions,
menuTriggerOptions, getMenuTriggerOptions,
routerTransitionOptions, routerTransitionOptions,
menuTypeList, menuTypeList,
} from './enum'; } from './enum';
...@@ -134,6 +134,14 @@ export default defineComponent({ ...@@ -134,6 +134,14 @@ export default defineComponent({
* @description: * @description:
*/ */
function renderFeatures() { function renderFeatures() {
let triggerDef = unref(getTrigger);
const triggerOptions = getMenuTriggerOptions(unref(getSplit));
const some = triggerOptions.some((item) => item.value === triggerDef);
if (!some) {
triggerDef = TriggerEnum.FOOTER;
}
return ( return (
<> <>
<SwitchItem <SwitchItem
...@@ -183,13 +191,15 @@ export default defineComponent({ ...@@ -183,13 +191,15 @@ export default defineComponent({
event={HandlerEnum.MENU_TOP_ALIGN} event={HandlerEnum.MENU_TOP_ALIGN}
def={unref(getTopMenuAlign)} def={unref(getTopMenuAlign)}
options={topMenuAlignOptions} options={topMenuAlignOptions}
disabled={!unref(getShowHeader) || (!unref(getIsTopMenu) && !unref(getSplit))} disabled={
!unref(getShowHeader) || unref(getSplit) || (!unref(getIsTopMenu) && !unref(getSplit))
}
/> />
<SelectItem <SelectItem
title={t('layout.setting.menuCollapseButton')} title={t('layout.setting.menuCollapseButton')}
event={HandlerEnum.MENU_TRIGGER} event={HandlerEnum.MENU_TRIGGER}
def={unref(getTrigger)} def={triggerDef}
options={menuTriggerOptions} options={triggerOptions}
disabled={!unref(getShowMenuRef)} disabled={!unref(getShowMenuRef)}
/> />
<SelectItem <SelectItem
......
...@@ -76,20 +76,26 @@ export const topMenuAlignOptions = [ ...@@ -76,20 +76,26 @@ export const topMenuAlignOptions = [
}, },
]; ];
export const menuTriggerOptions = [ export const getMenuTriggerOptions = (hideTop: boolean) => {
{ return [
value: TriggerEnum.NONE, {
label: t('layout.setting.menuTriggerNone'), value: TriggerEnum.NONE,
}, label: t('layout.setting.menuTriggerNone'),
{ },
value: TriggerEnum.FOOTER, {
label: t('layout.setting.menuTriggerBottom'), value: TriggerEnum.FOOTER,
}, label: t('layout.setting.menuTriggerBottom'),
{ },
value: TriggerEnum.HEADER, ...(hideTop
label: t('layout.setting.menuTriggerTop'), ? []
}, : [
]; {
value: TriggerEnum.HEADER,
label: t('layout.setting.menuTriggerTop'),
},
]),
];
};
export const routerTransitionOptions = [ export const routerTransitionOptions = [
RouterTransitionEnum.ZOOM_FADE, RouterTransitionEnum.ZOOM_FADE,
......
...@@ -25,6 +25,7 @@ export function handler(event: HandlerEnum, value: any): DeepPartial<ProjectConf ...@@ -25,6 +25,7 @@ export function handler(event: HandlerEnum, value: any): DeepPartial<ProjectConf
type, type,
collapsed: false, collapsed: false,
show: true, show: true,
hidden: false,
...splitOpt, ...splitOpt,
}, },
}; };
......
import './index.less'; <template>
<div
import { computed, defineComponent, ref, unref, CSSProperties } from 'vue'; v-if="getMenuFixed && !getIsMobile"
:style="getHiddenDomStyle"
import { Layout } from 'ant-design-vue'; :class="{ hidden: !showClassSideBarRef }"
import LayoutMenu from '../menu'; />
<Sider
import { MenuModeEnum, MenuSplitTyeEnum } from '/@/enums/menuEnum'; ref="sideRef"
breakpoint="lg"
import { useMenuSetting } from '/@/hooks/setting/useMenuSetting'; collapsible
import { useTrigger, useDragLine, useSiderEvent } from './useLayoutSider'; :class="getSiderClass"
import { useAppInject } from '/@/hooks/web/useAppInject'; :width="getMenuWidth"
import { useDesign } from '/@/hooks/web/useDesign'; :collapsed="getIsMobile ? false : getCollapsed"
:collapsedWidth="getCollapsedWidth"
import DragBar from './DragBar.vue'; :theme="getMenuTheme"
export default defineComponent({ @collapse="onCollapseChange"
name: 'LayoutSideBar', @breakpoint="onBreakpointChange"
setup() { v-bind="getTriggerAttr"
const dragBarRef = ref<ElRef>(null); >
const sideRef = ref<ElRef>(null); <template #trigger v-if="getShowTrigger">
<LayoutTrigger />
const { </template>
getCollapsed, <LayoutMenu :theme="getMenuTheme" :menuMode="getMode" :splitType="getSplitType" />
getMenuWidth, <DragBar ref="dragBarRef" />
getSplit, </Sider>
getMenuTheme, </template>
getRealWidth, <script lang="ts">
getMenuHidden, import { computed, defineComponent, ref, unref, CSSProperties } from 'vue';
getMenuFixed,
getIsMixMode, import { Layout } from 'ant-design-vue';
} = useMenuSetting(); import LayoutMenu from '../menu';
import LayoutTrigger from '/@/layouts/default/trigger/index.vue';
const { prefixCls } = useDesign('layout-sideBar');
import { MenuModeEnum, MenuSplitTyeEnum } from '/@/enums/menuEnum';
const { getIsMobile } = useAppInject();
import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
const { getTriggerAttr, getTriggerSlot } = useTrigger(getIsMobile); import { useTrigger, useDragLine, useSiderEvent } from './useLayoutSider';
import { useAppInject } from '/@/hooks/web/useAppInject';
useDragLine(sideRef, dragBarRef); import { useDesign } from '/@/hooks/web/useDesign';
const { getCollapsedWidth, onBreakpointChange, onCollapseChange } = useSiderEvent(); import DragBar from './DragBar.vue';
export default defineComponent({
const getMode = computed(() => { name: 'LayoutSideBar',
return unref(getSplit) ? MenuModeEnum.INLINE : null; components: { Sider: Layout.Sider, LayoutMenu, DragBar, LayoutTrigger },
}); setup() {
const dragBarRef = ref<ElRef>(null);
const getSplitType = computed(() => { const sideRef = ref<ElRef>(null);
return unref(getSplit) ? MenuSplitTyeEnum.LEFT : MenuSplitTyeEnum.NONE;
}); const {
getCollapsed,
const showClassSideBarRef = computed(() => { getMenuWidth,
return unref(getSplit) ? !unref(getMenuHidden) : true; getSplit,
}); getMenuTheme,
getRealWidth,
getMenuHidden,
getMenuFixed,
getIsMixMode,
} = useMenuSetting();
const { prefixCls } = useDesign('layout-sideBar');
const { getIsMobile } = useAppInject();
const { getTriggerAttr, getShowTrigger } = useTrigger(getIsMobile);
useDragLine(sideRef, dragBarRef);
const { getCollapsedWidth, onBreakpointChange, onCollapseChange } = useSiderEvent();
const getMode = computed(() => {
return unref(getSplit) ? MenuModeEnum.INLINE : null;
});
const getSplitType = computed(() => {
return unref(getSplit) ? MenuSplitTyeEnum.LEFT : MenuSplitTyeEnum.NONE;
});
const showClassSideBarRef = computed(() => {
return unref(getSplit) ? !unref(getMenuHidden) : true;
});
const getSiderClass = computed(() => {
return [
prefixCls,
{
[`${prefixCls}--fixed`]: unref(getMenuFixed),
hidden: !unref(showClassSideBarRef),
[`${prefixCls}--mix`]: unref(getIsMixMode) && !unref(getIsMobile),
},
];
});
const getHiddenDomStyle = computed(
(): CSSProperties => {
const width = `${unref(getRealWidth)}px`;
return {
width: width,
overflow: 'hidden',
flex: `0 0 ${width}`,
maxWidth: width,
minWidth: width,
transition: 'all 0.2s',
};
}
);
const getSiderClass = computed(() => { return {
return [
prefixCls, prefixCls,
{ sideRef,
[`${prefixCls}--fixed`]: unref(getMenuFixed), dragBarRef,
hidden: !unref(showClassSideBarRef), getIsMobile,
[`${prefixCls}--mix`]: unref(getIsMixMode) && !unref(getIsMobile), getHiddenDomStyle,
}, getSiderClass,
]; getTriggerAttr,
}); getCollapsedWidth,
getMenuFixed,
const getHiddenDomStyle = computed( showClassSideBarRef,
(): CSSProperties => { getMenuWidth,
const width = `${unref(getRealWidth)}px`; getCollapsed,
return { getMenuTheme,
width: width, onBreakpointChange,
overflow: 'hidden', getMode,
flex: `0 0 ${width}`, getSplitType,
maxWidth: width, onCollapseChange,
minWidth: width, getShowTrigger,
transition: 'all 0.2s', };
}; },
} });
); </script>
<style lang="less">
function renderDefault() { @import './index.less';
return ( </style>
<>
<LayoutMenu
theme={unref(getMenuTheme)}
menuMode={unref(getMode)}
splitType={unref(getSplitType)}
/>
<DragBar ref={dragBarRef} />
</>
);
}
return () => {
return (
<>
{unref(getMenuFixed) && !unref(getIsMobile) && (
<div style={unref(getHiddenDomStyle)} class={{ hidden: !unref(showClassSideBarRef) }} />
)}
<Layout.Sider
ref={sideRef}
breakpoint="lg"
collapsible
class={unref(getSiderClass)}
width={unref(getMenuWidth)}
collapsed={unref(getIsMobile) ? false : unref(getCollapsed)}
collapsedWidth={unref(getCollapsedWidth)}
theme={unref(getMenuTheme)}
onCollapse={onCollapseChange}
onBreakpoint={onBreakpointChange}
{...unref(getTriggerAttr)}
>
{{
...unref(getTriggerSlot),
default: () => renderDefault(),
}}
</Layout.Sider>
</>
);
};
},
});
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import Sider from './LayoutSider'; import Sider from './LayoutSider.vue';
import { Drawer } from 'ant-design-vue'; import { Drawer } from 'ant-design-vue';
import { useAppInject } from '/@/hooks/web/useAppInject'; import { useAppInject } from '/@/hooks/web/useAppInject';
import { useMenuSetting } from '/@/hooks/setting/useMenuSetting'; import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
......
import type { Ref } from 'vue'; import type { Ref } from 'vue';
import { computed, unref, onMounted, nextTick, ref } from 'vue'; import { computed, unref, onMounted, nextTick, ref } from 'vue';
import LayoutTrigger from '/@/layouts/default/trigger/index.vue';
import { TriggerEnum } from '/@/enums/menuEnum'; import { TriggerEnum } from '/@/enums/menuEnum';
...@@ -45,7 +44,7 @@ export function useSiderEvent() { ...@@ -45,7 +44,7 @@ export function useSiderEvent() {
export function useTrigger(getIsMobile: Ref<boolean>) { export function useTrigger(getIsMobile: Ref<boolean>) {
const { getTrigger, getSplit } = useMenuSetting(); const { getTrigger, getSplit } = useMenuSetting();
const showTrigger = computed(() => { const getShowTrigger = computed(() => {
const trigger = unref(getTrigger); const trigger = unref(getTrigger);
return ( return (
...@@ -56,7 +55,7 @@ export function useTrigger(getIsMobile: Ref<boolean>) { ...@@ -56,7 +55,7 @@ export function useTrigger(getIsMobile: Ref<boolean>) {
}); });
const getTriggerAttr = computed(() => { const getTriggerAttr = computed(() => {
if (unref(showTrigger)) { if (unref(getShowTrigger)) {
return {}; return {};
} }
return { return {
...@@ -64,16 +63,7 @@ export function useTrigger(getIsMobile: Ref<boolean>) { ...@@ -64,16 +63,7 @@ export function useTrigger(getIsMobile: Ref<boolean>) {
}; };
}); });
const getTriggerSlot = computed(() => { return { getTriggerAttr, getShowTrigger };
if (unref(showTrigger)) {
return {
trigger: () => <LayoutTrigger />,
};
}
return {};
});
return { getTriggerAttr, getTriggerSlot };
} }
/** /**
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论