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实现防抖函数、节流函数,全局使用【输入框、按钮】 阅读详情

相关推荐

WGCNA分析中那些没人告诉你的坑:以肺结核差异基因模块筛选为例

本文深入探讨WGCNA分析在肺结核差异基因模块筛选中的七个关键陷阱,包括soft-thresholding选取、样本离群值检测、模块合并阈值调整等。通过实际案例和R代码示例,揭示生信数据挖掘中常被忽视的技术细节,帮助研究者避免常见错误,提升分析结果的可靠性和生物学意义。

weixin_29218509的博客 262

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

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

小多的博客 2609

拆解爆火AI图文日报!用扣子(Coze)工作流,10分钟实现自动化新闻早报

当用户提供一则新闻内容时,仔细分析新闻中的关键信息。提取新闻事件的核心要点,包括事件主体、发生时间、地点、主要情节等。用简洁的语言对新闻进行总结,控制在[X]字以内(可根据实际需求设定字数限制)。若用户提供多条新闻,对比各新闻之间的异同点。从事件类型、影响范围、发展趋势等方面进行分析。综合总结多条新闻的整体情况,以有条理的方式呈现给用户。

一身都是月 2430

watch中使用防抖不生效

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

An滴饭儿的博客 1769

ST-LINK调试STM32H743必看:CubeMX工程中缺失的这行代码导致程序跑飞

本文深入剖析了使用ST-LINK调试STM32H743时,因CubeMX工程中缺失电源电压档位配置代码而导致程序跑飞或出现“Can not access memory”错误的问题。文章解释了H7系列电源与时钟耦合的核心原理,提供了具体的代码修复方案和系统化的调试排查思路,帮助开发者从根本上解决这一常见调试困境。

weixin_29191669的博客 282

vue3 全局定义防抖函数

vue3 全局定义防抖组件

qq_38184425的博客 4402

在WebView中对第三方H5页面的文本密码框添加自定义随机键盘

前言: 首先介绍一下这个需求的背景,由于公司是涉及到金融行业的需要与银行对接资金存管。出于保密性这里不直接列出公司名字和银行名字。从2018年国家对金融行业大整改以来,为了能够顺利通过备案,我们也跟着政府的脚步一步一步走向合规。 好了,大致就是因为要通过备案,必须把这个需求实现,否则将不会通过。 需求内容就是,当客户端有关资金交易的时候,会通过加密数据以及秘钥的方式把第三方银行的页面(充值、...

比较喜欢、笑的博客专栏 1586

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

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

Delete_89x的博客 8056

LilyGO T-Watch学习(一)环境搭建,编译下载

1、安装arduino IDE, 安装后按照说明添加lib IDE上选择“项目->加载库->添加.ZIP库”,选择C:\Users\用户名\Documents\Arduino\libraries\下的TTGO_TWatch_Library-master.zip; 查看是否添加成功: 项目->加载库,滑到最后可看见已添加的TTGO... 参考:https://github.com/Xinyuan-LilyGO/TTGO_TWatch_Library 2、安装esp32 ardui

hxl5955的博客 2907

【QT开发教程】Qt中的跨平台文件系统操作

文件系统操作是应用程序开发中经常需要处理的任务。Qt提供了一套跨平台的文件系统操作API,使开发者能够在不同操作系统上无缝地进行文件和目录操作。本文将介绍Qt中的跨平台文件系统操作,包括基本概念、常用类和方法以及实际示例。

科技改变人类,技术成就未来 983

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

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

王图思睿 7301

safetensors_rust.SafetensorError: Error while deserializing header: MetadataIncompleteBuffer解决方案

本文主要介绍了safetensors_rust.SafetensorError: Error while deserializing header: MetadataIncompleteBuffer解决方案,希望能对使用Python的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 Windows 2.2 Linux

weixin_43178406的博客 15万+

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

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

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

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

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

weixin_1095的博客 1369

Statistics and Machine Learning Toolbox

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

函数防抖和函数节流

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

田兴的博客 5608

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

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、付费专栏及课程。

余额充值