import { ref } from 'vue'; /** * 按钮节流Hook * @param callback 点击后执行的业务逻辑回调 * @param delay 节流时间(默认1500ms) * @returns 节流后的点击事件函数 * @template T 回调函数的参数类型(支持多参数元组) */ export const useThrottle = ( callback: (...args: T) => void | Promise, delay: number = 1500 ) => { // 标记是否可点击 const isClickable = ref(true); // 节流后的函数,支持传递任意参数 const throttledFn = async (...args: T) => { if (!isClickable.value) return; // 锁定按钮 isClickable.value = false; try { // 执行业务回调,支持异步函数 await callback(...args); } catch (error) { console.error('节流回调执行失败:', error); throw error; // 抛出错误,方便组件内捕获 } finally { // 延迟后解锁按钮(无论成功/失败都解锁) setTimeout(() => { isClickable.value = true; }, delay); } }; return throttledFn; };