useLayoutSider.tsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. import type { Ref } from 'vue';
  2. import { computed, unref, onMounted, nextTick, ref } from 'vue';
  3. import LayoutTrigger from '/@/layouts/default/trigger/index.vue';
  4. import { TriggerEnum } from '/@/enums/menuEnum';
  5. import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
  6. import { useDebounce } from '/@/hooks/core/useDebounce';
  7. /**
  8. * Handle related operations of menu events
  9. */
  10. export function useSiderEvent() {
  11. const initRef = ref(false);
  12. const brokenRef = ref(false);
  13. const collapseRef = ref(true);
  14. const { setMenuSetting, getCollapsed, getMiniWidthNumber } = useMenuSetting();
  15. const getCollapsedWidth = computed(() => {
  16. return unref(brokenRef) ? 0 : unref(getMiniWidthNumber);
  17. });
  18. function onCollapseChange(val: boolean) {
  19. if (initRef.value) {
  20. collapseRef.value = val;
  21. setMenuSetting({ collapsed: val });
  22. } else {
  23. !unref(getCollapsed) && setMenuSetting({ collapsed: val });
  24. }
  25. initRef.value = true;
  26. }
  27. function onBreakpointChange(broken: boolean) {
  28. brokenRef.value = broken;
  29. }
  30. return { getCollapsedWidth, onCollapseChange, onBreakpointChange };
  31. }
  32. /**
  33. * Handle related operations of menu folding
  34. */
  35. export function useTrigger() {
  36. const { getTrigger } = useMenuSetting();
  37. const showTrigger = computed(() => {
  38. const trigger = unref(getTrigger);
  39. return trigger !== TriggerEnum.NONE && trigger === TriggerEnum.FOOTER;
  40. });
  41. const getTriggerAttr = computed(() => {
  42. if (unref(showTrigger)) {
  43. return {};
  44. }
  45. return {
  46. trigger: null,
  47. };
  48. });
  49. const getTriggerSlot = computed(() => {
  50. if (unref(showTrigger)) {
  51. return {
  52. trigger: () => <LayoutTrigger />,
  53. };
  54. }
  55. return {};
  56. });
  57. return { getTriggerAttr, getTriggerSlot };
  58. }
  59. /**
  60. * Handle menu drag and drop related operations
  61. * @param siderRef
  62. * @param dragBarRef
  63. */
  64. export function useDragLine(siderRef: Ref<any>, dragBarRef: Ref<any>) {
  65. const { getMiniWidthNumber, getCollapsed, setMenuSetting, getCanDrag } = useMenuSetting();
  66. const getDragBarStyle = computed(() => {
  67. if (unref(getCollapsed)) {
  68. return { left: `${unref(getMiniWidthNumber)}px` };
  69. }
  70. return {};
  71. });
  72. onMounted(() => {
  73. nextTick(() => {
  74. const [exec] = useDebounce(changeWrapWidth, 20);
  75. exec();
  76. });
  77. });
  78. function renderDragLine() {
  79. return (
  80. <div
  81. class={[`layout-sidebar__darg-bar`, { hide: !unref(getCanDrag) }]}
  82. style={unref(getDragBarStyle)}
  83. ref={dragBarRef}
  84. />
  85. );
  86. }
  87. function handleMouseMove(ele: HTMLElement, wrap: HTMLElement, clientX: number) {
  88. document.onmousemove = function (innerE) {
  89. let iT = (ele as any).left + (innerE.clientX - clientX);
  90. innerE = innerE || window.event;
  91. const maxT = 600;
  92. const minT = unref(getMiniWidthNumber);
  93. iT < 0 && (iT = 0);
  94. iT > maxT && (iT = maxT);
  95. iT < minT && (iT = minT);
  96. ele.style.left = wrap.style.width = iT + 'px';
  97. return false;
  98. };
  99. }
  100. // Drag and drop in the menu area-release the mouse
  101. function removeMouseup(ele: any) {
  102. const wrap = unref(siderRef).$el;
  103. document.onmouseup = function () {
  104. document.onmousemove = null;
  105. document.onmouseup = null;
  106. const width = parseInt(wrap.style.width);
  107. const miniWidth = unref(getMiniWidthNumber);
  108. if (!unref(getCollapsed)) {
  109. width > miniWidth + 20
  110. ? setMenuSetting({ menuWidth: width })
  111. : setMenuSetting({ collapsed: true });
  112. } else {
  113. width > miniWidth && setMenuSetting({ collapsed: false, menuWidth: width });
  114. }
  115. ele.releaseCapture?.();
  116. };
  117. }
  118. function changeWrapWidth() {
  119. const ele = unref(dragBarRef) as any;
  120. const side = unref(siderRef);
  121. const wrap = (side || {}).$el;
  122. ele &&
  123. (ele.onmousedown = (e: any) => {
  124. wrap.style.transition = 'unset';
  125. const clientX = e?.clientX;
  126. ele.left = ele.offsetLeft;
  127. handleMouseMove(ele, wrap, clientX);
  128. removeMouseup(ele);
  129. ele.setCapture?.();
  130. return false;
  131. });
  132. }
  133. return { renderDragLine };
  134. }