vue-vben-admin/src/layouts/default/sider/index.tsx

121 lines
3.2 KiB
TypeScript
Raw Normal View History

2020-11-24 22:59:29 +08:00
import './index.less';
2020-12-15 00:13:23 +08:00
import { computed, defineComponent, ref, unref, CSSProperties } from 'vue';
2020-11-24 22:59:29 +08:00
import { Layout } from 'ant-design-vue';
import LayoutMenu from '../menu';
import { MenuModeEnum, MenuSplitTyeEnum } from '/@/enums/menuEnum';
import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
import { useTrigger, useDragLine, useSiderEvent } from './useLayoutSider';
2020-12-15 00:13:23 +08:00
import { useAppInject } from '/@/hooks/web/useAppInject';
import { useDesign } from '/@/hooks/web/useDesign';
2020-11-24 22:59:29 +08:00
export default defineComponent({
name: 'LayoutSideBar',
setup() {
const dragBarRef = ref<ElRef>(null);
const sideRef = ref<ElRef>(null);
const {
getCollapsed,
getMenuWidth,
getSplit,
getMenuTheme,
getRealWidth,
getMenuHidden,
getMenuFixed,
2020-12-15 00:13:23 +08:00
getIsMixMode,
2020-11-24 22:59:29 +08:00
} = useMenuSetting();
2020-12-15 00:13:23 +08:00
const { prefixCls } = useDesign('layout-sideBar');
2020-11-24 22:59:29 +08:00
const { getTriggerAttr, getTriggerSlot } = useTrigger();
2020-12-15 00:13:23 +08:00
const { getIsMobile } = useAppInject();
2020-11-24 22:59:29 +08:00
const { renderDragLine } = useDragLine(sideRef, dragBarRef);
2020-12-15 00:13:23 +08:00
const { getCollapsedWidth, onBreakpointChange, onCollapseChange } = useSiderEvent();
2020-11-24 22:59:29 +08:00
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(() => {
2020-12-15 00:13:23 +08:00
return [
prefixCls,
{
[`${prefixCls}--fixed`]: unref(getMenuFixed),
hidden: !unref(showClassSideBarRef),
[`${prefixCls}--mix`]: unref(getIsMixMode),
},
];
2020-11-24 22:59:29 +08:00
});
2020-11-25 23:20:30 +08:00
const getHiddenDomStyle = computed(
(): CSSProperties => {
const width = `${unref(getRealWidth)}px`;
return {
width: width,
overflow: 'hidden',
flex: `0 0 ${width}`,
maxWidth: width,
minWidth: width,
2020-12-10 23:58:11 +08:00
transition: 'all 0.2s',
2020-11-25 23:20:30 +08:00
};
}
);
2020-11-24 22:59:29 +08:00
function renderDefault() {
return (
<>
<LayoutMenu
theme={unref(getMenuTheme)}
menuMode={unref(getMode)}
splitType={unref(getSplitType)}
/>
{renderDragLine()}
</>
);
}
return () => {
return (
<>
2020-12-15 00:13:23 +08:00
{unref(getMenuFixed) && !unref(getIsMobile) && (
2020-11-24 22:59:29 +08:00
<div style={unref(getHiddenDomStyle)} class={{ hidden: !unref(showClassSideBarRef) }} />
)}
<Layout.Sider
ref={sideRef}
2020-12-07 22:18:57 +08:00
breakpoint="lg"
2020-11-24 22:59:29 +08:00
collapsible
class={unref(getSiderClass)}
width={unref(getMenuWidth)}
collapsed={unref(getCollapsed)}
collapsedWidth={unref(getCollapsedWidth)}
theme={unref(getMenuTheme)}
onCollapse={onCollapseChange}
onBreakpoint={onBreakpointChange}
{...unref(getTriggerAttr)}
>
{{
...unref(getTriggerSlot),
default: () => renderDefault(),
}}
</Layout.Sider>
</>
);
};
},
});