11 changed files with 204 additions and 157 deletions
@ -1,121 +0,0 @@ |
|||
import './index.less'; |
|||
|
|||
import { computed, defineComponent, ref, unref, 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 { useTrigger, useDragLine, useSiderEvent } from './useLayoutSider'; |
|||
import { useAppInject } from '/@/hooks/web/useAppInject'; |
|||
import { useDesign } from '/@/hooks/web/useDesign'; |
|||
|
|||
import DragBar from './DragBar.vue'; |
|||
export default defineComponent({ |
|||
name: 'LayoutSideBar', |
|||
setup() { |
|||
const dragBarRef = ref<ElRef>(null); |
|||
const sideRef = ref<ElRef>(null); |
|||
|
|||
const { |
|||
getCollapsed, |
|||
getMenuWidth, |
|||
getSplit, |
|||
getMenuTheme, |
|||
getRealWidth, |
|||
getMenuHidden, |
|||
getMenuFixed, |
|||
getIsMixMode, |
|||
} = useMenuSetting(); |
|||
|
|||
const { prefixCls } = useDesign('layout-sideBar'); |
|||
|
|||
const { getIsMobile } = useAppInject(); |
|||
|
|||
const { getTriggerAttr, getTriggerSlot } = 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', |
|||
}; |
|||
} |
|||
); |
|||
|
|||
function renderDefault() { |
|||
return ( |
|||
<> |
|||
<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> |
|||
</> |
|||
); |
|||
}; |
|||
}, |
|||
}); |
|||
@ -0,0 +1,132 @@ |
|||
<template> |
|||
<div |
|||
v-if="getMenuFixed && !getIsMobile" |
|||
:style="getHiddenDomStyle" |
|||
:class="{ hidden: !showClassSideBarRef }" |
|||
/> |
|||
<Sider |
|||
ref="sideRef" |
|||
breakpoint="lg" |
|||
collapsible |
|||
:class="getSiderClass" |
|||
:width="getMenuWidth" |
|||
:collapsed="getIsMobile ? false : getCollapsed" |
|||
:collapsedWidth="getCollapsedWidth" |
|||
:theme="getMenuTheme" |
|||
@collapse="onCollapseChange" |
|||
@breakpoint="onBreakpointChange" |
|||
v-bind="getTriggerAttr" |
|||
> |
|||
<template #trigger v-if="getShowTrigger"> |
|||
<LayoutTrigger /> |
|||
</template> |
|||
<LayoutMenu :theme="getMenuTheme" :menuMode="getMode" :splitType="getSplitType" /> |
|||
<DragBar ref="dragBarRef" /> |
|||
</Sider> |
|||
</template> |
|||
<script lang="ts"> |
|||
import { computed, defineComponent, ref, unref, CSSProperties } from 'vue'; |
|||
|
|||
import { Layout } from 'ant-design-vue'; |
|||
import LayoutMenu from '../menu'; |
|||
import LayoutTrigger from '/@/layouts/default/trigger/index.vue'; |
|||
|
|||
import { MenuModeEnum, MenuSplitTyeEnum } from '/@/enums/menuEnum'; |
|||
|
|||
import { useMenuSetting } from '/@/hooks/setting/useMenuSetting'; |
|||
import { useTrigger, useDragLine, useSiderEvent } from './useLayoutSider'; |
|||
import { useAppInject } from '/@/hooks/web/useAppInject'; |
|||
import { useDesign } from '/@/hooks/web/useDesign'; |
|||
|
|||
import DragBar from './DragBar.vue'; |
|||
export default defineComponent({ |
|||
name: 'LayoutSideBar', |
|||
components: { Sider: Layout.Sider, LayoutMenu, DragBar, LayoutTrigger }, |
|||
setup() { |
|||
const dragBarRef = ref<ElRef>(null); |
|||
const sideRef = ref<ElRef>(null); |
|||
|
|||
const { |
|||
getCollapsed, |
|||
getMenuWidth, |
|||
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', |
|||
}; |
|||
} |
|||
); |
|||
|
|||
return { |
|||
prefixCls, |
|||
sideRef, |
|||
dragBarRef, |
|||
getIsMobile, |
|||
getHiddenDomStyle, |
|||
getSiderClass, |
|||
getTriggerAttr, |
|||
getCollapsedWidth, |
|||
getMenuFixed, |
|||
showClassSideBarRef, |
|||
getMenuWidth, |
|||
getCollapsed, |
|||
getMenuTheme, |
|||
onBreakpointChange, |
|||
getMode, |
|||
getSplitType, |
|||
onCollapseChange, |
|||
getShowTrigger, |
|||
}; |
|||
}, |
|||
}); |
|||
</script> |
|||
<style lang="less"> |
|||
@import './index.less'; |
|||
</style> |
|||
Loading…
Reference in new issue