long-press.ts 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import { vibrate } from "@/uni_modules/cool-vibrate";
  2. import { onUnmounted } from "vue";
  3. // 长按触发延迟时间,单位毫秒
  4. const DELAY = 500;
  5. // 长按重复执行间隔时间,单位毫秒
  6. const REPEAT = 100;
  7. /**
  8. * 长按操作钩子函数返回类型
  9. */
  10. type UseLongPress = {
  11. // 开始长按
  12. start: (cb: () => void) => void;
  13. // 停止长按
  14. stop: () => void;
  15. // 清除定时器
  16. clear: () => void;
  17. // 是否正在长按中
  18. isPressing: boolean;
  19. };
  20. /**
  21. * 长按操作钩子函数
  22. * 支持长按持续触发,可用于数字输入框等需要连续操作的场景
  23. */
  24. export const useLongPress = (): UseLongPress => {
  25. // 长按延迟定时器
  26. let pressTimer: number = 0;
  27. // 重复执行定时器
  28. let repeatTimer: number = 0;
  29. // 是否正在长按中
  30. let isPressing = false;
  31. /**
  32. * 清除所有定时器
  33. * 重置长按状态
  34. */
  35. const clear = () => {
  36. // 清除长按延迟定时器
  37. if (pressTimer != 0) {
  38. clearTimeout(pressTimer);
  39. pressTimer = 0;
  40. }
  41. // 清除重复执行定时器
  42. if (repeatTimer != 0) {
  43. clearInterval(repeatTimer);
  44. repeatTimer = 0;
  45. }
  46. // 重置长按状态
  47. isPressing = false;
  48. };
  49. /**
  50. * 开始长按操作
  51. * @param cb 长按时重复执行的回调函数
  52. */
  53. const start = (cb: () => void) => {
  54. // 清除已有定时器
  55. clear();
  56. // 立即执行一次回调
  57. cb();
  58. // 延迟500ms后开始长按
  59. // @ts-ignore
  60. pressTimer = setTimeout(() => {
  61. // 震动
  62. vibrate(1);
  63. // 设置长按状态
  64. isPressing = true;
  65. // 每100ms重复执行回调
  66. // @ts-ignore
  67. repeatTimer = setInterval(() => {
  68. cb();
  69. }, REPEAT);
  70. }, DELAY);
  71. };
  72. /**
  73. * 停止长按操作
  74. * 清除定时器并重置状态
  75. */
  76. const stop = () => {
  77. clear();
  78. };
  79. // 组件卸载时清理定时器
  80. onUnmounted(() => {
  81. clear();
  82. });
  83. return {
  84. start,
  85. stop,
  86. clear,
  87. isPressing
  88. };
  89. };