123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- import { computed, defineComponent, nextTick, onMounted, ref, unref } from 'vue';
- import { Layout } from 'ant-design-vue';
- import SideBarTrigger from './SideBarTrigger';
- import { menuStore } from '/@/store/modules/menu';
- // import darkMiniIMg from '/@/assets/images/sidebar/dark-mini.png';
- // import lightMiniImg from '/@/assets/images/sidebar/light-mini.png';
- import darkImg from '/@/assets/images/sidebar/dark.png';
- import lightImg from '/@/assets/images/sidebar/light.png';
- import { appStore } from '/@/store/modules/app';
- import { MenuModeEnum, MenuSplitTyeEnum, MenuThemeEnum } from '/@/enums/menuEnum';
- import { useDebounce } from '/@/hooks/core/useDebounce';
- import LayoutMenu from './LayoutMenu';
- export default defineComponent({
- name: 'DefaultLayoutSideBar',
- setup() {
- const initRef = ref(false);
- const brokenRef = ref(false);
- const collapseRef = ref(true);
- const dragBarRef = ref<Nullable<HTMLDivElement>>(null);
- const sideRef = ref<any>(null);
- const getProjectConfigRef = computed(() => {
- return appStore.getProjectConfig;
- });
- // 根据展开状态设置背景图片
- const getStyle = computed((): any => {
- // const collapse = unref(collapseRef);
- const theme = unref(getProjectConfigRef).menuSetting.theme;
- let bg = '';
- if (theme === MenuThemeEnum.DARK) {
- // bg = collapse ? darkMiniIMg : darkImg;
- bg = darkImg;
- }
- if (theme === MenuThemeEnum.LIGHT) {
- bg = lightImg;
- // bg = collapse ? lightMiniImg : lightImg;
- }
- return {
- 'background-image': `url(${bg})`,
- };
- });
- function onCollapseChange(val: boolean) {
- if (initRef.value) {
- collapseRef.value = val;
- menuStore.commitCollapsedState(val);
- } else {
- const collapsed = appStore.getProjectConfig.menuSetting.collapsed;
- !collapsed && menuStore.commitCollapsedState(val);
- }
- initRef.value = true;
- }
- // 菜单区域拖拽 - 鼠标移动
- function handleMouseMove(ele: any, wrap: any, clientX: number) {
- document.onmousemove = function (innerE) {
- let iT = ele.left + ((innerE || event).clientX - clientX);
- innerE = innerE || window.event;
- // let tarnameb = innerE.target || innerE.srcElement;
- const maxT = 600;
- const minT = 80;
- iT < 0 && (iT = 0);
- iT > maxT && (iT = maxT);
- iT < minT && (iT = minT);
- ele.style.left = wrap.style.width = iT + 'px';
- return false;
- };
- }
- // 菜单区域拖拽 - 鼠标松开
- function removeMouseup(ele: any) {
- const wrap = unref(sideRef).$el;
- document.onmouseup = function () {
- document.onmousemove = null;
- document.onmouseup = null;
- const width = parseInt(wrap.style.width);
- menuStore.commitDragStartState(false);
- if (!menuStore.getCollapsedState) {
- if (width > 100) {
- setMenuWidth(width);
- } else {
- menuStore.commitCollapsedState(true);
- }
- } else {
- if (width > 80) {
- setMenuWidth(width);
- menuStore.commitCollapsedState(false);
- }
- }
- ele.releaseCapture && ele.releaseCapture();
- };
- }
- function setMenuWidth(width: number) {
- appStore.commitProjectConfigState({
- menuSetting: {
- menuWidth: width,
- },
- });
- }
- function changeWrapWidth() {
- const ele = unref(dragBarRef) as any;
- const side = unref(sideRef);
- const wrap = (side || {}).$el;
- // const eleWidth = 6;
- ele &&
- (ele.onmousedown = (e: any) => {
- menuStore.commitDragStartState(true);
- wrap.style.transition = 'unset';
- const clientX = (e || event).clientX;
- ele.left = ele.offsetLeft;
- handleMouseMove(ele, wrap, clientX);
- removeMouseup(ele);
- ele.setCapture && ele.setCapture();
- return false;
- });
- }
- function handleBreakpoint(broken: boolean) {
- brokenRef.value = broken;
- }
- onMounted(() => {
- nextTick(() => {
- const [exec] = useDebounce(changeWrapWidth, 20);
- exec();
- });
- });
- const getDragBarStyle = computed(() => {
- if (menuStore.getCollapsedState) {
- return { left: '80px' };
- }
- return {};
- });
- const getCollapsedWidth = computed(() => {
- return unref(brokenRef) ? 0 : 80;
- });
- function renderDragLine() {
- const { menuSetting: { hasDrag = true } = {} } = unref(getProjectConfigRef);
- return (
- <div
- class={[`layout-sidebar__dargbar`, !hasDrag ? 'hide' : '']}
- style={unref(getDragBarStyle)}
- ref={dragBarRef}
- />
- );
- }
- return () => {
- const {
- menuSetting: { theme, split: splitMenu },
- } = unref(getProjectConfigRef);
- const { getCollapsedState, getMenuWidthState } = menuStore;
- return (
- <Layout.Sider
- onCollapse={onCollapseChange}
- breakpoint="md"
- width={getMenuWidthState}
- collapsed={getCollapsedState}
- collapsible
- collapsedWidth={unref(getCollapsedWidth)}
- theme={theme}
- class="layout-sidebar"
- ref={sideRef}
- onBreakpoint={handleBreakpoint}
- style={unref(getStyle)}
- >
- {{
- trigger: () => <SideBarTrigger />,
- default: () => (
- <>
- <LayoutMenu
- theme={theme}
- menuMode={splitMenu ? MenuModeEnum.INLINE : null}
- splitType={splitMenu ? MenuSplitTyeEnum.LEFT : MenuSplitTyeEnum.NONE}
- />
- {renderDragLine()}
- </>
- ),
- }}
- </Layout.Sider>
- );
- };
- },
- });
|