vue 防抖函数、节流函数,工具类封装及遇到的问题

vue3 TS防抖函数 写VUE3+TS项目时,写到一个模糊查询提示相关信息的功能,没找到合适的防抖函数,利用TS的特性写了一个简单易懂的防抖函数,希望能帮到大家。 阅读详情

防抖函数(可用于防止重复提交)

当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次, 如果设定时间到来之前,又触发了事件,就重新开始延时。也就是说当一个用户一直触发这个函数,且每次触发函数的间隔小于既定时间,那么防抖的情况下只会执行一次。

/**
* 防抖函数(可用于防止重复提交)
* 当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,
* 如果设定时间到来之前,又触发了事件,就重新开始延时。也就是说当一个用户一直触发这个函数,
* 且每次触发函数的间隔小于既定时间,那么防抖的情况下只会执行一次。
*
* @param func 执行函数
* @param wait 间隔时间
* @param immediate 立即执行
*/
function debounce(fn, wait, immediate) {
   let timer;
   return function() {
       if (timer) clearTimeout(timer);
       if (immediate) {
           // 如果已经执行过,不再执行
           var callNow = !timer;
           timer = setTimeout(() => {
               timer = null;
           }, wait)
           if (callNow) {
               fn.apply(this, arguments)
           }
       } else {
           timer = setTimeout(() => {
               fn.apply(this, arguments)
           }, wait);
       }
   }
}

节流函数

当持续触发事件时,保证在一定时间内只调用一次事件处理函数,意思就是说,假设一个用户一直触发这个函数,且每次触发小于既定值,函数节流会每隔这个时间调用一次
用一句话总结防抖和节流的区别:防抖是将多次执行变为最后一次执行,节流是将多次执行变为每隔一段时间执行
实现函数节流我们主要有两种方法:时间戳和定时器

/**
 * 节流函数
 * 当持续触发事件时,保证在一定时间内只调用一次事件处理函数,意思就是说,假设一个用户一直触发这个函数,且每次触发
 * 小于既定值,函数节流会每隔这个时间调用一次
 * 用一句话总结防抖和节流的区别:防抖是将多次执行变为最后一次执行,节流是将多次执行变为每隔一段时间执行
 * 实现函数节流我们主要有两种方法:时间戳和定时器
 *
 * @param func 执行函数
 * @param wait 间隔时间
 * @param options 立即执行
 * options中  leading:false 表示禁用第一次执行 trailing: false 表示禁用停止触发的回调
 */
function throttle(fn, wait, options = {}) {
    let timer;
    let previous = 0;
    let throttled = function() {
        let now = +new Date();
        // remaining 不触发下一次函数的剩余时间
        if (!previous && options.leading === false) previous = now;
        let remaining = wait - (now - previous);
        if (remaining < 0) {
            if (timer) {
                clearTimeout(timer);
                timer = null;
            }
            previous = now;
            fn.apply(this, arguments)
        } else if (!timer && options.trailing !== false) {
            timer = setTimeout(() => {
                previous = options.leading === false ? 0 : new Date().getTime();
                timer = null;
                fn.apply(this, arguments);
            }, remaining);
        }
    }
    return throttled;
}

vue中调用防抖函数不生效的解决方法

import {debounce} from "../../util.js"
 add(e){
            debounce(function(){
                console.log("点击")
            },500)
        }
    }

最开始向上面这样写,会发现debounce函数执行了,但是其返回的一个延时函数并没有执行。仔细检查发现,没有调用执行其返回的一个函数。所以应该将调用处改为如下;

 add(e){
            // console.log("点击")
            // delay(()=>{
            //     console.log("点击")
            // },500)
            debounce(function(){
                console.log("点击")
            },500)()//加括号表示调用其返回的那个函数
        }
    }

现在的问题

首先 如果以以上的方式 来存timer等外层变量 有两种情况使用保留 且不同组件不相互影响

1.组件中引入工具对象,可以同样选择在data中增加一个debounceFn:null句柄来保存这个闭包,然后在组件初始化阶段给设置好 如图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0QCYUjJs-1622432123960)(http://doc.tianbp.com/server/index.php?s=/api/attachment/visitFile/sign/fd653d47526726a5e5e54bc76ca76666)]

2.存到methods会相对好点(记得拆闭包)

methods: { handleInputChange:utl.debounce(function(){
      console.log(this.inputText);
    },1500)
  },
  watch: {
    inputText(newVal) {
      if (newVal !== "") {
        // 经过节流
        this.handleInputChange();
      }
    }
  },
  beforeDestroy() {
    this.handleInputChange = null;
  }
第二种 就是 timer等外层变量 作为全局变量

这样 就不会因为每次调用了都重置了 也不需要在组件去保留这个方法 只是作为全局 你要保证传入的时间内不会有第二个按钮被点击 不然依旧不会生效 因为 timer还存在

//公用方法里:
let timer;//放在公用方法外面 每次使用 都不会刷新
function debounce(fn, wait, immediate) {

}

如有更好的方式 欢迎指教

vue实现防抖函数、节流函数,全局使用【输入框、按钮】 阅读详情

相关推荐

PAT|中国大学MOOC-浙江大学翁恺-C语言程序设计习题集(更新中)

##2-0. 整数四则运算 时间限制:400 ms 内存限制:65536 kB 代码长度限制:8000 B 判题程序:Standard 作者:乔林(清华大学) 本题要求编写程序,计算2个正整数的和、差、积、商并输出。题目保证输入和输出全部在整型范围内。 输入格式: 输入在一行中给出2个正整数A和B。 输出格式: 在4行中按照格式“A 运算符 B = 结果”顺序输出和、差、积、商。 输入样例: 3 ...

小鱼波波波 6万+

vue中使用闭包(例如防抖和节流)失效问题(直接调用)

原因:这个和vue的事件绑定原理有关。如果直接在函数体内部使用的话,结果就是,一个匿名的立即执行函数来进行执行。由于每次触发点击事件都会返回一个新的匿名函数, 就会生成一个新的函数执行期上下文(称之为执行栈),所以就会防抖/节流就会失效。防抖/节流使用无效,(例如防抖,按钮点击多次依旧执行多次)----> 查看是闭包无效,定义的局部变量依旧为初值。----> 没有相应清除定时器。// 以下方法调用不生效。

小多的博客 2609

【IPAM】Netbox docker模式版本升级

NETBOX 是一个开源的网络资源管理系统,主要用于管理 IP 地址、机架、设备、接口等网络资源信息。下面是 NETBOX 的功能、优点和缺点的详细介绍。

u012153104的博客 1330

watch中使用防抖不生效

今天遇到一个功能,列表查询,本来没什么,直接调后台接口就ok,可是需要有几个查询项,其中一个就是根据‘工单编号’查询,产品要求输入文本发生变化就触发查询事件,这个必然是需要防抖的。于是,我将防抖函数用在了watch中的监听工单编号发生变化的函数中。。。不生效。查了好多资料,最终写法如下: created () { this.debouncednewFormName = this.debounce(()=>{ this.getOrderList(1) }, 500) }, //防抖函

An滴饭儿的博客 1769

Qwen3.5本地部署实战:4B模型在RTX3060上离线运行指南

大语言模型本地化部署正从云端服务转向终端设备,其核心是模型轻量化、硬件适配与推理引擎协同优化。基于INT4量化感知训练和GGUF格式支持,Qwen3.5在结构精简、Tokenizer轻量及显存友好性方面显著优于前代,使4B级别模型可在RTX 3060等中端显卡上稳定运行。该技术路径兼顾低延迟响应(<2秒)、数据隐私保障与离线可用性,广泛适用于法律文书分析、医疗文档处理、教育AI助手等对安全性与实时性双重要求的场景。本文聚焦Qwen3.5-4B量化部署全流程,涵盖llama.cpp编译调优、GPU层加载策略及

weixin_32181267的博客 366

遥感新手别纠结!实测ENVI 5.3、5.6、6.0三个免费版,教你混搭安装避坑

本文为遥感新手提供ENVI 5.3、5.6、6.0三个免费版的实测对比与混搭安装指南,帮助用户构建零成本高效工作流。详细解析各版本功能差异、共存安装技巧及常见问题解决方案,特别适合课程作业、毕业论文分析和遥感入门练习。

weixin_30819085的博客 479

vue3 全局定义防抖函数

vue3 全局定义防抖组件

qq_38184425的博客 4402

深入解析Carry4的内部结构与工作原理

本文深入解析了Xilinx/AMD FPGA中的核心硬件资源Carry4的内部结构和工作原理。作为实现超前进位的关键物理电路,Carry4通过其CI、DI、S、O、CO等端口,高效处理4位算术运算的进位逻辑。文章通过端口详解、结构分析和实战计算示例,揭示了其如何加速加法、减法等运算,并探讨了其在优化FPGA设计时序与资源利用中的关键作用。

n4o5p6q7r的博客 503

vue记录-vue中使用lodash _.debounce防抖不生效原因,解决方案

vue中使用lodash _.debounce防抖不生效原因,解决方案

Delete_89x的博客 8056

数据库迁移策略实战:MySQL到PostgreSQL

数据库迁移是一项复杂且细致的任务,需要充分的准备工作、合适的迁移策略和严格的验证与优化步骤。通过选择合适的迁移工具、进行手动迁移和应用程序适配、以及迁移后的验证与优化,可以确保数据迁移的成功和业务的连续性。希望本文的分享能够为大家在MySQL到PostgreSQL的数据库迁移实战中提供一些有用的参考和启示。

shejizuopin的博客 1734

避开这5个坑!STC8H DMA串口通信的实战避坑指南(115200波特率实测)

本文深入解析了STC8H单片机利用DMA实现稳定全双工串口通信的实战要点。针对115200高波特率场景,详细拆解了DMA-UART架构、关键寄存器配置、时钟精度计算、缓冲区管理及中断协同等核心环节,并提供了具体的避坑指南和调试方法,帮助开发者构建高效可靠的通信链路。

melon的博客 675

什么是防抖和节流?vue 中如何使用防抖和节流

原文地址:https://blog.error.work/qd/59.html 介绍 在 JavaScript 中,防抖和节流其实是一个很重要的概念。主要应用场景就是会频繁触发的事件,比如监听滚动、点赞功能,总不能点一次赞就向后台发送一次数据,这时候就要用到防抖和节流。 防抖和节流的核心就是定时器,我们要知道定时器的一个概念,就是在定时之后,在没触发之前清除定时器,这个定时器方法不会被触发。 防抖...

王图思睿 7301

⭐️VMwareWorkstation17.0虚拟机安装搭建Windows 7虚拟机(完整图文详细步骤含配置VMware Tools教程)

本教程为大家提供了从安装VMware Workstation 17.0开始,到在虚拟机上成功搭建Windows 7专业版系统的完整步骤。我们详细介绍了准备阶段所需的软件和硬件要求,以及在VMware中配置和安装Windows 7系统的每一步操作。此外,我们还特别提到了如何在虚拟机上配置VMware Tools,以便更好地与宿主机进行交互。 通过本教程的学习,读者不仅能够掌握在VMware Workstation 17.0上安装Windows 7虚拟机的技能,还能了解到如何配置虚拟机的硬件以及安装VMwar

Python老吕的博客 2万+

Vue实战技巧:从零开始封装全局防抖和节流函数

Vue实战技巧:从零开始封装全局防抖和节流函数

希望看完文章的你能够带着答案离开。 5031

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

vue2:封装全局防抖和节流函数

防抖和节流是两种常见的优化技术,用于控制事件的触发频率,以提高性能和用户体验。防抖它限制一个函数在连续触发事件后,只执行一次。当事件被触发时,防抖函数会设置一个定时器。如果在指定的时间内再次触发事件,定时器会被清除并重新设置。只有当事件停止触发一段时间后,定时器才会执行相应的函数。防抖常用于处理在用户频繁操作时的回调函数,例如在输入框输入时触发搜索操作。通过防抖,可以减少不必要的函数调用,提高性能。节流它控制函数在一段时间内的触发频率。

weixin_1095的博客 1369

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

函数防抖和函数节流

问题引入 问题1: 如果实现了dom拖拽功能,但是在绑定拖拽事件的时候发现每当元素稍微移动一点便触发了大量的回调函数,导致浏览器直接卡死,这个时候怎么办? 问题2: 如果给一个按钮绑定了表单提交的post事件,但是用户有些时候在网络情况极差的情况下多次点击按钮造成表单重复提交,如何防止多次提交的发生? 为了应对如上场景,便出现了函数防抖和函数节流两个概念,总的来说: 这两个方法是在时间轴上控制函数的执行次数。 定义 函数防抖 是指在事件被触发 n 秒后再执行回调,如果在这 n 秒内事件又被触发,则重新

田兴的博客 5608

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

vue中使用防抖节流

1.什么是防抖节流 函数防抖(debounce) 是指在一定时间内,在动作被连续频繁触发的情况下,动作只会被执行一次,也就是说当调用动作过n毫秒后,才会执行该动作,若在这n毫秒内又调用此动作则将重新计算执行时间,所以短时间内的连续动作永远只会触发一次。 函数节流 是指一定时间内执行的操作只执行一次,也就是说即预先设定一个执行周期,当调用动作的时刻大于等于执行周期则执行该动作,然后进入下一个新周期,一个比较形象的例子是如果将水龙头拧紧直到水是以水滴的形式流出,那你会发现每隔一段时间,就会有一滴水流出。

nilmao的博客 1万+

vue正确的使用函数的防抖与节流

函数的防抖与节流是一直的面试话题。对于函数防抖与节流的写法,大家都可能比较熟悉,但是在vue中使用函数的防抖或者节流,这里是有一个小插曲的哦。 vue中的正确使用姿势 在这个地方相信好多人的使用方式,会直接定义函数,然后在函数中使用debounce的 ,这样的使用方法是错误的。 为啥呢?这个和vue的事件绑定原理有关,这里不详细介绍。如果直接在函数体内部使用的话,最后的结果是,一个匿名的立即执行函数来进行执行,这样是不对的。详细参考 原理 函数的防抖 函数的防抖是在多少时间后再来执行函数,我们.

twinkle的博客 3339

vue2项目中按钮实现防抖、节流功能,包含封装代码以及使用

javascript实现防抖节流,防抖,节流,vue2,elementui,vue2防抖节流封装实现

qq_58441775的博客 8636

Vue中使用函数防抖和节流

函数防抖(Debounce):指触发事件后在n秒内函数只执行一次,如果在n秒内又触发了事件,则会重新计算函数执行时间。如:搜素框,滚动条 函数节流(throttle):指连续触发事件但在n秒中只执行一次,避免某些事件频繁触发。如:按钮点击

刘运召的博客 3926

在 JS 文件和 Vue 组件中使用防抖节流函数

如题,最近笔者发现如果将防抖节流函数写成工具类函数放在公共文件中进行调用的话,在一般的JS文件里调用和在Vue组件中调用是有不同的区别的。首先我们参考网上其他资料写一个防抖函数和一个节流函数: 防抖函数(debounce): function debounce(func, wait, immediate) { var timeout return function () {......

似水流年的博客 1万+

VUE防抖与节流的最佳解决方案——函数式组件

前言 有echarts使用经验的同学可能遇到过这样的场景,在window.onresize事件回调里触发echartsBox.resize()方法来达到重绘的目的,resize事件是连续触发的这意味着echarts实例会连续的重绘这是非常耗性能的。还有一个常见的场景在input标签的input事件里请求后端接口,input事件也是连续触发的,假设我输入了“12”就会请求两次接口参数分别是“1”和...

weixin_33905756的博客 6484

vue封装防抖节流函数,防抖函数先执行一次,再延迟,lodash防抖节流函数使用

防抖节流函数是什么 防抖:触发高频事件后 n 秒内函数只会执行一次,如果 n 秒内高频事件再次被触发,则重新计算时间。通俗来说就是n个事件发生了,我只认最后一次。比如一个需求,一个输入框,当我输入内容之后会请求接口搜索出与输入框内容相关的数据,这个输入框的change事件在输入的时候高频触发,如果每次改变都去请求接口会造成很大的性能问题,这个时候的做法可能是当我停止输入一秒之后再去请求接口,就只会发起一次请求 节流:高频事件触发的时候,每隔n秒执行一次。防抖函数的弊端–当我一直输入一直不停那么函数就一直不会

阮俊维的博客 3843

vue 封装防抖、节流

函数防抖是指在一定时间内,在动作被连续频繁触发的情况下,动作只会被执行一次,也就是说当调用动作过n毫秒后,才会执行该动作,若在这n毫秒内又调用此动作则将重新计算执行时间,所以短时间内的连续动作永远只会触发一次。函数节流对于短时间内大量触发同一事件(滚动事件、输入框实时搜索),那么在函数执行一次之后,该函数在指定的时间期限内不再工作,直至过了这段时间才重新生效函数节流(throttle)与函数防抖(debounce)都是为了限制函数的执行频次。...

m0_51262126的博客 3683

如何使用 Vue 和 Axios 对接口进行防抖和节流处理

在上述代码中,我们创建了一个 axios 实例,并对该实例进行了防抖处理。在前端开发中,“防抖”指的是在一定时间内只能触发一次事件,通常是输入框或滚动事件。在上述代码中,我们创建了一个 axios 实例,并对该实例进行了节流处理。在拦截器中,我们通过比较当前时间和上一次请求的时间,来决定是否进行节流处理。在前端开发中,“节流”通常指的是在一定时间内只能执行一次事件,例如:下拉加载更多、页面滚动等。防抖的实现原理非常简单,就是通过对要执行的函数进行延迟处理,以此来控制函数执行的次数。

来福的世界 2473

vue 节流函数防抖函数封装

封装 assets/js/public.js /** * 函数防抖 * @param fn * @param delay * @returns {Function} * @constructor */ export const Debounce = (fn, t) => { let delay = t || 500; let timer; return function() { let args = arguments; i..

姥姥家的饭 3084
上一篇: 金额保留n位小数,及保留方式
下一篇: 微信公众平台测试帐号申请及Token验证地址提供
起风了咦
博客等级 码龄7年 2粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值