当前位置: 首页 > news >正文

vue2指令方式防抖功能

基础防抖功能

  1. 通过 delay 参数控制防抖时间,默认 2000ms
  2. 在防抖期间会禁用按钮,防止重复点击

灵活的参数传递

  1. 支持向防抖函数传递参数:args: [arg1, arg2]
  2. 可以自定义防抖时间:delay: 2000

智能的开关控制

  1. 通过 enable 参数控制防抖功能是否启用
  2. 当 enable: false 时,防抖功能会被禁用

依赖监听机制

  1. 通过 watch 参数监听数据变化
  2. 当监听的数据发生变化时,会重置防抖状态
    例如:watch: selectTreeList 当 selectTreeList 变化时会重置防抖

用户友好的提示

  1. 支持自定义重复点击提示信息:tip: ‘请勿重复点击’
  2. 提示信息以优雅的弹窗形式展示
  3. 提示会在 1 秒后自动消失

完整的生命周期管理

  1. bind: 初始化防抖功能
  2. update: 处理数据变化和状态更新
  3. unbind: 清理定时器和相关属性

优雅的 UI 交互

  1. 防抖期间按钮会被禁用
  2. 提示信息采用固定定位,居中显示
  3. 使用半透明背景,提供良好的视觉体验

安全性和健壮性

  1. 对函数参数进行类型检查
  2. 提供警告信息
  3. 完善的资源清理机制
/*** 增强版防抖指令* 功能:支持参数传递、开关控制、依赖监听、重复点击提示* 使用方式:* 1. 基本用法: v-debounce="{fn: handleClick, delay: 2000}"* 2. 带参数: v-debounce="{fn: handleClick, delay: 2000, args: [arg1, arg2]}"* 3. 控制开关: v-debounce="{fn: handleClick, delay: 2000, enable: true}"* 4. 监听变化: v-debounce="{fn: handleClick, delay: 2000, watch: selectTreeList}"* 5. 提示信息: v-debounce="{fn: handleClick, delay: 2000, tip: '请勿重复点击'}"*/
export default {bind(el, binding) {if (typeof binding.value.fn !== 'function') {console.warn('v-debounce指令需要传入一个函数');return;}const delay = binding.value.delay || 2000;const enable = binding.value.enable !== false;const tip = binding.value.tip || '请勿重复点击';let timer = null;let isDisabled = false;// 挂载重置方法到元素实例el._debounceReset = () => {isDisabled = false;el.disabled = false;if (timer) {clearTimeout(timer);timer = null;}};// 初始化监听值if (binding.value.watch) {el._lastWatchValue = JSON.stringify(binding.value.watch);}const executeFn = () => {binding.value.fn(...(binding.value.args || []));};el.addEventListener('click', () => {if (!enable) return;if (isDisabled) {console.log('isDisabled', isDisabled);console.log('显示提示信息');// 显示提示信息const tipEl = document.createElement('div');tipEl.style.cssText = `position: fixed;top: 50%;left: 50%;transform: translate(-50%, -50%);background: rgba(0, 0, 0, 0.7);color: white;padding: 10px 20px;border-radius: 4px;z-index: 9999;`;tipEl.textContent = tip;document.body.appendChild(tipEl);// 1秒后移除提示setTimeout(() => {document.body.removeChild(tipEl);}, 1000);return;}isDisabled = true;el.disabled = true;executeFn();timer = setTimeout(el._debounceReset, delay);});},update(el, binding) {// 检查watch值变化if (binding.value.watch) {const currentValue = JSON.stringify(binding.value.watch);if (el._lastWatchValue !== currentValue) {el._lastWatchValue = currentValue;el._debounceReset();}}// 处理enable状态变化if (binding.value.enable === false && el.disabled) {el._debounceReset();}},unbind(el) {clearTimeout(el._debounceTimer);delete el._debounceReset;delete el._lastWatchValue;},
};

用法

 <el-button:disabled="disabledLogCollect":loading="!isCollect"v-permission="'vd.sr.logCollect.UserLogCollection'"type="primary":data-warden-title="userLogs.UserlogsCollect":element-loading-text="$t('loading')"v-debounce="{fn: Submit,delay: 3000,enable: true,watch: selectTreeList,tip: $t('debounceTip'),}">
http://www.xdnf.cn/news/685585.html

相关文章:

  • 征程 6X VDSP 调试方法
  • ​​全球购订单查询接口开放:ERP自动同步实战手册​
  • 程序员出海之英语-基础-小猪佩奇 第 1 季第 1 集 泥坑
  • LMEval ,谷歌开源的统一评估多模态AI模型框架
  • MySQL省市区数据表
  • 基于BERT和GPT2的实现来理解Transformer的结构和原理
  • adb查看、设置cpu相关信息
  • azure配置管道监控任务
  • 本地github ssh多账号问题
  • 【Golang入门】第四章:控制结构——从条件分支到异常处理
  • 华为OD机试真题——最小矩阵宽度(宽度最小的子矩阵)(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现
  • craw4ai 抓取实时信息,与 mt4外行行情结合实时交易,基本面来觉得趋势方向,搞一个外汇交易策略
  • FFMPEG推流器讲解
  • CSS选择器:has使用示例
  • MySQL问题:MySQL中主要的锁都有啥?
  • day4 cpp:
  • 杰发科技AC7840——CSE硬件加密模块使用(2)
  • 深入解析 Tomcat 线程管理机制:从设计思想到性能调优
  • 基于正点原子阿波罗F429开发板的LWIP应用(4)——HTTP Server功能
  • 类和对象(中1)
  • 如何加载私钥为 SecKeyRef
  • Word表格怎样插入自动序号或编号
  • AMBA总线家族成员
  • 基于FPGA的DES加解密系统verilog实现,包含testbench和开发板硬件测试
  • c++设计模式-单例模式
  • 数据类型(基本类型下半)day3
  • 智警杯备赛--数据库管理与优化
  • [神经网络]使用olivettiface数据集进行训练并优化,观察对比loss结果
  • LINUX528 重定向
  • Git使用手册保姆级教程