useTimeout.ts 638 B

1234567891011121314151617181920212223242526272829
  1. import { watchEffect, Ref, unref, isRef } from "vue";
  2. export function useTimeout(
  3. fn: () => void,
  4. delay?: Ref<number | undefined> | number,
  5. options?: {
  6. immediate?: boolean;
  7. }
  8. ) {
  9. const immediate = options?.immediate;
  10. if (immediate) {
  11. fn();
  12. }
  13. watchEffect((onInvalidate) => {
  14. if (isRef(delay)) {
  15. if (typeof delay.value !== "number" || delay.value < 0) return;
  16. } else {
  17. if (typeof delay !== "number" || delay < 0) return;
  18. }
  19. const _deply = unref(delay);
  20. const timer = setTimeout(() => {
  21. fn();
  22. }, _deply);
  23. onInvalidate(() => {
  24. clearInterval(timer);
  25. });
  26. });
  27. }