Преглед на файлове

fix: fix useTimeoutFn not work

vben преди 4 години
родител
ревизия
b49950a390

+ 4 - 4
src/components/Container/src/LazyContainer.vue

@@ -22,7 +22,7 @@
   import { defineComponent, reactive, onMounted, ref, toRef, toRefs } from 'vue';
 
   import { Skeleton } from 'ant-design-vue';
-  import { useTimeoutFn } from '@vueuse/core';
+  import { useTimeoutFn } from '/@/hooks/core/useTimeout';
   import { useIntersectionObserver } from '/@/hooks/event/useIntersectionObserver';
   interface State {
     isInit: boolean;
@@ -40,9 +40,9 @@
 
       // The viewport where the component is located. If the component is scrolling in the page container, the viewport is the container
       viewport: {
-        type: (typeof window !== 'undefined' ? window.HTMLElement : Object) as PropType<
-          HTMLElement
-        >,
+        type: (typeof window !== 'undefined'
+          ? window.HTMLElement
+          : Object) as PropType<HTMLElement>,
         default: () => null,
       },
 

+ 1 - 1
src/components/Container/src/collapse/CollapseContainer.vue

@@ -32,7 +32,7 @@
 
   import { triggerWindowResize } from '/@/utils/event/triggerWindowResizeEvent';
   // hook
-  import { useTimeoutFn } from '@vueuse/core';
+  import { useTimeoutFn } from '/@/hooks/core/useTimeout';
 
   export default defineComponent({
     components: {

+ 1 - 1
src/components/Modal/src/Modal.tsx

@@ -1,7 +1,7 @@
 import { Modal } from 'ant-design-vue';
 import { defineComponent, watchEffect } from 'vue';
 import { basicProps } from './props';
-import { useTimeoutFn } from '@vueuse/core';
+import { useTimeoutFn } from '/@/hooks/core/useTimeout';
 import { extendSlots } from '/@/utils/helper/tsxHelper';
 
 export default defineComponent({

+ 1 - 1
src/components/Table/src/hooks/useDataSource.ts

@@ -3,7 +3,7 @@ import type { PaginationProps } from '../types/pagination';
 
 import { watch, ref, unref, ComputedRef, computed, onMounted, Ref } from 'vue';
 
-import { useTimeoutFn } from '@vueuse/core';
+import { useTimeoutFn } from '/@/hooks/core/useTimeout';
 
 import { buildUUID } from '/@/utils/uuid';
 import { isFunction, isBoolean } from '/@/utils/is';

+ 1 - 1
src/components/Verify/src/DragVerify.tsx

@@ -1,5 +1,5 @@
 import { defineComponent, ref, computed, unref, reactive, watch, watchEffect } from 'vue';
-import { useTimeoutFn } from '@vueuse/core';
+import { useTimeoutFn } from '/@/hooks/core/useTimeout';
 import { useEventListener } from '/@/hooks/event/useEventListener';
 import { basicProps } from './props';
 import { getSlot } from '/@/utils/helper/tsxHelper';

+ 1 - 1
src/components/Verify/src/ImgRotate.tsx

@@ -1,7 +1,7 @@
 import type { MoveData, DragVerifyActionType } from './types';
 
 import { defineComponent, computed, unref, reactive, watch, ref, getCurrentInstance } from 'vue';
-import { useTimeoutFn } from '@vueuse/core';
+import { useTimeoutFn } from '/@/hooks/core/useTimeout';
 
 import BasicDragVerify from './DragVerify';
 

+ 1 - 1
src/components/Verify/src/VerifyModal.vue

@@ -1,7 +1,7 @@
 <script lang="tsx">
   import { defineComponent, ref, unref } from 'vue';
   import { BasicModal } from '/@/components/Modal/index';
-  import { useTimeoutFn } from '@vueuse/core';
+  import { useTimeoutFn } from '/@/hooks/core/useTimeout';
 
   import { RotateDragVerify, DragVerifyActionType } from '/@/components/Verify/index';
   export default defineComponent({

+ 43 - 0
src/hooks/core/useTimeout.ts

@@ -0,0 +1,43 @@
+import { ref, watch } from 'vue';
+import { tryOnUnmounted } from '/@/utils/helper/vueHelper';
+
+import { isFunction } from '/@/utils/is';
+
+export function useTimeoutFn(handle: Fn<any>, wait: number) {
+  if (!isFunction(handle)) {
+    throw new Error('handle is not Function!');
+  }
+
+  const { readyRef, stop, start } = useTimeoutRef(wait);
+
+  watch(
+    readyRef,
+    (maturity) => {
+      maturity && handle();
+    },
+    { immediate: false }
+  );
+  return { readyRef, stop, start };
+}
+
+export function useTimeoutRef(wait: number) {
+  const readyRef = ref(false);
+
+  let timer: ReturnType<typeof setTimeout> | undefined;
+  function stop(): void {
+    readyRef.value = false;
+    timer && window.clearTimeout(timer);
+  }
+  function start(): void {
+    stop();
+    timer = setTimeout(() => {
+      readyRef.value = true;
+    }, wait);
+  }
+
+  start();
+
+  tryOnUnmounted(stop);
+
+  return { readyRef, stop, start };
+}

+ 1 - 1
src/hooks/web/useApexCharts.ts

@@ -1,4 +1,4 @@
-import { useTimeoutFn } from '@vueuse/core';
+import { useTimeoutFn } from '/@/hooks/core/useTimeout';
 import { tryOnUnmounted } from '/@/utils/helper/vueHelper';
 import { unref, Ref, nextTick } from 'vue';
 

+ 1 - 1
src/hooks/web/useECharts.ts

@@ -1,4 +1,4 @@
-import { useTimeoutFn } from '@vueuse/core';
+import { useTimeoutFn } from '/@/hooks/core/useTimeout';
 import { tryOnUnmounted } from '/@/utils/helper/vueHelper';
 import { unref, Ref, nextTick } from 'vue';
 import type { EChartOption, ECharts } from 'echarts';

+ 7 - 0
src/hooks/web/useMessage.tsx

@@ -46,6 +46,7 @@ function getIcon(iconType: string) {
     return <CloseCircleFilled class="modal-icon-error" />;
   }
 }
+
 function renderContent({ content }: Pick<ModalOptionsEx, 'content'>) {
   return <div innerHTML={`<div>${content as string}</div>`}></div>;
 }
@@ -64,6 +65,7 @@ function createConfirm(options: ModalOptionsEx): ConfirmOptions {
   };
   return Modal.confirm(opt) as any;
 }
+
 const baseOptions = {
   okText: '确定',
   centered: true,
@@ -77,15 +79,19 @@ function createModalOptions(options: ModalOptionsPartial, icon: string): ModalOp
     icon: getIcon(icon),
   };
 }
+
 function createSuccessModal(options: ModalOptionsPartial) {
   return Modal.success(createModalOptions(options, 'success'));
 }
+
 function createErrorModal(options: ModalOptionsPartial) {
   return Modal.error(createModalOptions(options, 'close'));
 }
+
 function createInfoModal(options: ModalOptionsPartial) {
   return Modal.info(createModalOptions(options, 'info'));
 }
+
 function createWarningModal(options: ModalOptionsPartial) {
   return Modal.warning(createModalOptions(options, 'warning'));
 }
@@ -94,6 +100,7 @@ notification.config({
   placement: 'topRight',
   duration: 3,
 });
+
 /**
  * @description: message
  */

+ 1 - 1
src/hooks/web/useTabs.ts

@@ -1,4 +1,4 @@
-import { useTimeoutFn } from '@vueuse/core';
+import { useTimeoutFn } from '/@/hooks/core/useTimeout';
 import { PageEnum } from '/@/enums/pageEnum';
 import { TabItem, tabStore } from '/@/store/modules/tab';
 import { appStore } from '/@/store/modules/app';

+ 1 - 1
src/layouts/logo/index.vue

@@ -8,7 +8,7 @@
   import { computed, defineComponent, PropType, ref, watch } from 'vue';
   // hooks
   import { useSetting } from '/@/hooks/core/useSetting';
-  import { useTimeoutFn } from '@vueuse/core';
+  import { useTimeoutFn } from '/@/hooks/core/useTimeout';
   import { useGo } from '/@/hooks/web/usePage';
 
   import { PageEnum } from '/@/enums/pageEnum';