LayoutSideBar.tsx 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. import { computed, defineComponent, nextTick, onMounted, ref, unref } from 'vue';
  2. import { Layout } from 'ant-design-vue';
  3. import SideBarTrigger from './SideBarTrigger';
  4. import { menuStore } from '/@/store/modules/menu';
  5. // import darkMiniIMg from '/@/assets/images/sidebar/dark-mini.png';
  6. // import lightMiniImg from '/@/assets/images/sidebar/light-mini.png';
  7. import darkImg from '/@/assets/images/sidebar/dark.png';
  8. import lightImg from '/@/assets/images/sidebar/light.png';
  9. import { appStore } from '/@/store/modules/app';
  10. import { MenuModeEnum, MenuSplitTyeEnum, MenuThemeEnum } from '/@/enums/menuEnum';
  11. import { useDebounce } from '/@/hooks/core/useDebounce';
  12. import LayoutMenu from './LayoutMenu';
  13. export default defineComponent({
  14. name: 'DefaultLayoutSideBar',
  15. setup() {
  16. const initRef = ref(false);
  17. const brokenRef = ref(false);
  18. const collapseRef = ref(true);
  19. const dragBarRef = ref<Nullable<HTMLDivElement>>(null);
  20. const sideRef = ref<any>(null);
  21. const getProjectConfigRef = computed(() => {
  22. return appStore.getProjectConfig;
  23. });
  24. // 根据展开状态设置背景图片
  25. const getStyle = computed((): any => {
  26. // const collapse = unref(collapseRef);
  27. const theme = unref(getProjectConfigRef).menuSetting.theme;
  28. let bg = '';
  29. if (theme === MenuThemeEnum.DARK) {
  30. // bg = collapse ? darkMiniIMg : darkImg;
  31. bg = darkImg;
  32. }
  33. if (theme === MenuThemeEnum.LIGHT) {
  34. bg = lightImg;
  35. // bg = collapse ? lightMiniImg : lightImg;
  36. }
  37. return {
  38. 'background-image': `url(${bg})`,
  39. };
  40. });
  41. function onCollapseChange(val: boolean) {
  42. if (initRef.value) {
  43. collapseRef.value = val;
  44. menuStore.commitCollapsedState(val);
  45. } else {
  46. const collapsed = appStore.getProjectConfig.menuSetting.collapsed;
  47. !collapsed && menuStore.commitCollapsedState(val);
  48. }
  49. initRef.value = true;
  50. }
  51. // 菜单区域拖拽 - 鼠标移动
  52. function handleMouseMove(ele: any, wrap: any, clientX: number) {
  53. document.onmousemove = function (innerE) {
  54. let iT = ele.left + ((innerE || event).clientX - clientX);
  55. innerE = innerE || window.event;
  56. // let tarnameb = innerE.target || innerE.srcElement;
  57. const maxT = 600;
  58. const minT = 80;
  59. iT < 0 && (iT = 0);
  60. iT > maxT && (iT = maxT);
  61. iT < minT && (iT = minT);
  62. ele.style.left = wrap.style.width = iT + 'px';
  63. return false;
  64. };
  65. }
  66. // 菜单区域拖拽 - 鼠标松开
  67. function removeMouseup(ele: any) {
  68. const wrap = unref(sideRef).$el;
  69. document.onmouseup = function () {
  70. document.onmousemove = null;
  71. document.onmouseup = null;
  72. const width = parseInt(wrap.style.width);
  73. menuStore.commitDragStartState(false);
  74. if (!menuStore.getCollapsedState) {
  75. if (width > 100) {
  76. setMenuWidth(width);
  77. } else {
  78. menuStore.commitCollapsedState(true);
  79. }
  80. } else {
  81. if (width > 80) {
  82. setMenuWidth(width);
  83. menuStore.commitCollapsedState(false);
  84. }
  85. }
  86. ele.releaseCapture && ele.releaseCapture();
  87. };
  88. }
  89. function setMenuWidth(width: number) {
  90. appStore.commitProjectConfigState({
  91. menuSetting: {
  92. menuWidth: width,
  93. },
  94. });
  95. }
  96. function changeWrapWidth() {
  97. const ele = unref(dragBarRef) as any;
  98. const side = unref(sideRef);
  99. const wrap = (side || {}).$el;
  100. // const eleWidth = 6;
  101. ele &&
  102. (ele.onmousedown = (e: any) => {
  103. menuStore.commitDragStartState(true);
  104. wrap.style.transition = 'unset';
  105. const clientX = (e || event).clientX;
  106. ele.left = ele.offsetLeft;
  107. handleMouseMove(ele, wrap, clientX);
  108. removeMouseup(ele);
  109. ele.setCapture && ele.setCapture();
  110. return false;
  111. });
  112. }
  113. function handleBreakpoint(broken: boolean) {
  114. brokenRef.value = broken;
  115. }
  116. onMounted(() => {
  117. nextTick(() => {
  118. const [exec] = useDebounce(changeWrapWidth, 20);
  119. exec();
  120. });
  121. });
  122. const getDragBarStyle = computed(() => {
  123. if (menuStore.getCollapsedState) {
  124. return { left: '80px' };
  125. }
  126. return {};
  127. });
  128. const getCollapsedWidth = computed(() => {
  129. return unref(brokenRef) ? 0 : 80;
  130. });
  131. function renderDragLine() {
  132. const { menuSetting: { hasDrag = true } = {} } = unref(getProjectConfigRef);
  133. return (
  134. <div
  135. class={[`layout-sidebar__dargbar`, !hasDrag ? 'hide' : '']}
  136. style={unref(getDragBarStyle)}
  137. ref={dragBarRef}
  138. />
  139. );
  140. }
  141. return () => {
  142. const {
  143. menuSetting: { theme, split: splitMenu },
  144. } = unref(getProjectConfigRef);
  145. const { getCollapsedState, getMenuWidthState } = menuStore;
  146. return (
  147. <Layout.Sider
  148. onCollapse={onCollapseChange}
  149. breakpoint="md"
  150. width={getMenuWidthState}
  151. collapsed={getCollapsedState}
  152. collapsible
  153. collapsedWidth={unref(getCollapsedWidth)}
  154. theme={theme}
  155. class="layout-sidebar"
  156. ref={sideRef}
  157. onBreakpoint={handleBreakpoint}
  158. style={unref(getStyle)}
  159. >
  160. {{
  161. trigger: () => <SideBarTrigger />,
  162. default: () => (
  163. <>
  164. <LayoutMenu
  165. theme={theme}
  166. menuMode={splitMenu ? MenuModeEnum.INLINE : null}
  167. splitType={splitMenu ? MenuSplitTyeEnum.LEFT : MenuSplitTyeEnum.NONE}
  168. />
  169. {renderDragLine()}
  170. </>
  171. ),
  172. }}
  173. </Layout.Sider>
  174. );
  175. };
  176. },
  177. });