94 lines
2.5 KiB
JavaScript
94 lines
2.5 KiB
JavaScript
|
|
/**
|
|||
|
|
* 防抖工具函数
|
|||
|
|
* 用于防止用户快速多次点击导致重复执行
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
// 存储每个按钮的点击状态
|
|||
|
|
const clickStates = new Map();
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 防抖点击装饰器
|
|||
|
|
* @param {Function} func - 要防抖的函数
|
|||
|
|
* @param {number} delay - 防抖延迟时间(毫秒),默认1000ms
|
|||
|
|
* @param {string} key - 防抖标识符,用于区分不同的点击事件
|
|||
|
|
* @returns {Function} 防抖后的函数
|
|||
|
|
*/
|
|||
|
|
export function debounceClick(func, delay = 1000, key = null) {
|
|||
|
|
return function(...args) {
|
|||
|
|
// 如果没有提供key,使用函数的名称作为key
|
|||
|
|
const debounceKey = key || func.name || 'default';
|
|||
|
|
|
|||
|
|
// 如果该key正在防抖中,直接返回
|
|||
|
|
if (clickStates.has(debounceKey)) {
|
|||
|
|
console.log(`防抖拦截: ${debounceKey} 正在处理中...`);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 设置防抖状态
|
|||
|
|
clickStates.set(debounceKey, true);
|
|||
|
|
|
|||
|
|
// 执行原函数
|
|||
|
|
const result = func.apply(this, args);
|
|||
|
|
|
|||
|
|
// 延迟后清除防抖状态
|
|||
|
|
setTimeout(() => {
|
|||
|
|
clickStates.delete(debounceKey);
|
|||
|
|
console.log(`防抖解除: ${debounceKey}`);
|
|||
|
|
}, delay);
|
|||
|
|
|
|||
|
|
return result;
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 创建防抖点击方法
|
|||
|
|
* @param {Object} context - Vue组件实例上下文
|
|||
|
|
* @param {string} methodName - 方法名
|
|||
|
|
* @param {number} delay - 防抖延迟时间(毫秒),默认1000ms
|
|||
|
|
*/
|
|||
|
|
export function createDebounceMethod(context, methodName, delay = 1000) {
|
|||
|
|
const originalMethod = context[methodName];
|
|||
|
|
if (typeof originalMethod !== 'function') {
|
|||
|
|
console.warn(`方法 ${methodName} 不存在`);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
context[methodName] = debounceClick(originalMethod.bind(context), delay, methodName);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 批量创建防抖方法
|
|||
|
|
* @param {Object} context - Vue组件实例上下文
|
|||
|
|
* @param {Array} methods - 方法名数组
|
|||
|
|
* @param {number} delay - 防抖延迟时间(毫秒),默认1000ms
|
|||
|
|
*/
|
|||
|
|
export function createDebounceMethods(context, methods, delay = 1000) {
|
|||
|
|
methods.forEach(methodName => {
|
|||
|
|
createDebounceMethod(context, methodName, delay);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 清除所有防抖状态(用于页面销毁时清理)
|
|||
|
|
*/
|
|||
|
|
export function clearAllDebounceStates() {
|
|||
|
|
clickStates.clear();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 检查某个key是否正在防抖中
|
|||
|
|
* @param {string} key - 防抖标识符
|
|||
|
|
* @returns {boolean} 是否正在防抖中
|
|||
|
|
*/
|
|||
|
|
export function isDebouncing(key) {
|
|||
|
|
return clickStates.has(key);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 手动清除某个key的防抖状态
|
|||
|
|
* @param {string} key - 防抖标识符
|
|||
|
|
*/
|
|||
|
|
export function clearDebounceState(key) {
|
|||
|
|
clickStates.delete(key);
|
|||
|
|
}
|