import './index.less'; import { computed, defineComponent, ref, unref, watch, nextTick, CSSProperties } from 'vue'; import { Layout } from 'ant-design-vue'; import LayoutMenu from '../menu'; import { MenuModeEnum, MenuSplitTyeEnum } from '/@/enums/menuEnum'; import { useMenuSetting } from '/@/hooks/setting/useMenuSetting'; import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting'; import { useTrigger, useDragLine, useSiderEvent } from './useLayoutSider'; import { useLayoutContext } from '../useLayoutContext'; export default defineComponent({ name: 'LayoutSideBar', setup() { const topRef = ref(0); const dragBarRef = ref(null); const sideRef = ref(null); const { getCollapsed, getMenuWidth, getSplit, getMenuTheme, getRealWidth, getMenuHidden, getMenuFixed, } = useMenuSetting(); const { getShowFullHeaderRef, getUnFixedAndFull } = useHeaderSetting(); const injectValue = useLayoutContext(); const { getTriggerAttr, getTriggerSlot } = useTrigger(); const { renderDragLine } = useDragLine(sideRef, dragBarRef); const { getCollapsedWidth, onBreakpointChange, onCollapseChange, onSiderClick, } = 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 { 'layout-sidebar': true, fixed: unref(getMenuFixed), hidden: !unref(showClassSideBarRef), }; }); const getSiderStyle = computed(() => { const top = `${unref(topRef)}px`; if (!unref(getMenuFixed)) { return { top }; } return { top, height: `calc(100% - ${top})`, }; }); watch( () => getShowFullHeaderRef.value, () => { topRef.value = 0; if (unref(getUnFixedAndFull)) return; nextTick(() => { const fullHeaderEl = unref(injectValue.fullHeader)?.$el; if (!fullHeaderEl) return; topRef.value = fullHeaderEl.offsetHeight; }); }, { immediate: true, } ); 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', }; } ); function renderDefault() { return ( <> {renderDragLine()} ); } return () => { return ( <> {unref(getMenuFixed) && !unref(injectValue.isMobile) && (
)} {{ ...unref(getTriggerSlot), default: () => renderDefault(), }} ); }; }, });