码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Vue2使用定时器和闭包实现防抖和节流函数。将函数放入util.js中,供具体功能在methods中调用


    Vue2使用定时器和闭包实现防抖和节流函数。
    将函数放入util.js中,供具体功能在methods中调用。
    参考文档:

    • 如何在Vue中优雅的使用防抖节流
    • 人类高质量JS防抖与节流机制
    • Vue项目中使用防抖和节流
    • vue2使用lodash中的防抖(debounce)函数
    • 从函数节流与防抖浅析this指向问题、闭包问题
    • this指向问题

    文章目录

    • 防抖函数实现 方式1:
      • util: debounce代码
      • 功能中调用
      • 执行结果
    • 防抖函数实现 方式2:
      • 代码
      • 功能中调用(存在错误)
      • 校正后的正确调用
      • 校正后的执行结果
    • 节流函数实现
      • 代码
      • 调用
      • 结果

    防抖函数实现 方式1:

    使用 this[fnName]()

    util: debounce代码

    let  util = {};
    
    util.debounce = function (fnName, delay = 500){
        let timer = null
        return function () {
            console.count('防抖函数执行')
            if(timer){
                clearTimeout(timer);
            }
            timer = setTimeout(()=>{
                this[fnName]();
            }, delay);
        }
    }
    
    export default util;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    功能中调用

      <Button @click="clickMe">我是一个防抖的按钮Button>
    
    • 1
    import util from "@/components/util";
    export default {
        methods:{
    		funcTest() {
    		  console.log('实际函数执行 start-----------')
    		  console.count('实际执行次数')
    		},
    		clickMe: util.debounce('funcTest', 500),
    	},
    	beforeDestroy() {
    		this.clickMe = null;
    	},
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    执行结果

    通过gif可以看到,我点击了四次按钮,最后一次点击0.5秒后才实际执行函数。
    防抖1

    防抖函数实现 方式2:

    使用 fn.apply(this, arguments)
    在网上的资料中,这种实现是最多的,但是把防抖函数放到util.js中,程序就会报错:起都起不来。

    Uncaught TypeError: Cannot read properties of undefined (reading ‘funcTest’)

    代码

    util.debounce2 = function(fn, delay = 500) {
        let timer = null;
        return function() {  // flag1
            console.count('防抖函数执行')
            console.log(fn)
            if (timer) {
                clearTimeout(timer);
            }
            timer = setTimeout(() => {
                fn.apply(this, arguments);
            }, delay);
        }
    }
    
    clickMe : util.debounce2 (this.funcTest, 500),
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    功能中调用(存在错误)

     clickMe: util.debounce2(this.funcTest, 500),
    
    • 1

    报错:
    在这里插入图片描述

    校正后的正确调用

    研究了vue中调用lodash的防抖函数的实现方式给了我灵感,我个人把他粗浅的解释为: util.debounce2是一个“外地人”,它无法找到funcTest()这个函数,当然,使用调用方中data中的任何一个变量也都会报错。所以需要使用clickDebounce本地化一下。

        clickDebounce: util.debounce2 ( function (){   // flag2
          this.funcTest()
        },500),
        funcTest() {
          console.log('实际函数执行 start-----------')
          console.count('实际执行次数')
        },
         /* clickMe: util.debounce2(this.funcTest, 500),*/
         clickMe (){
           this.clickDebounce()
        },
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    注意:代码 flag1和flag2中的 function(){}不能替换为箭头函数()=>{},因为箭头函数没有this,还是会报undefined的错误。

    校正后的执行结果

    通过结果,可以看到:可以实现防抖
    res2

    节流函数实现

    每个一段时间执行一次函数。避免一个函数在短时间内多次执行

    代码

    util.throttle = function(fn, delay = 500) {
        let lastCall = 0;
        return function() {
            console.count('节流函数执行')
            const now = Date.now();
            if (now - lastCall < delay) {
                return;
            }
            lastCall = now;
            return fn.apply(this, arguments);;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    调用

        clickThrottle: util.throttle(function () {
          this.funcTest()
        }, 1000),
        funcTest() {
          console.log('实际函数执行 start-----------')
          console.count('实际执行次数')
        },
         /* clickMe: util.debounce2(this.funcTest, 500),*/
        clickMe() {
          this.clickThrottle()
        },
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    结果

    通过gif可知,尽管点击频率很快,但是实际函数每隔1秒执行一次。
    res3

  • 相关阅读:
    MST56XXB 60V,150mA,2.1uA,高PSRR,高压低压差线性稳压器
    Ubuntu下安装Teamviewer所遇certificates.crt CRLfile: none问题
    SpringBoot自动装配原理
    ffmpeg、ffplay在线安装,离线导出整个程序,移植到其他服务器使用(linux系统)
    10年内取代iPhone,目标10亿用户,苹果押注AR头戴设备
    百度AI给出MFC使用进度条的例子
    浅谈泛在电力物联网、能源互联网与虚拟电厂
    kafka日志策略
    ArduPilot开源飞控之AP_Relay
    Java实现敏感日志脱敏
  • 原文地址:https://blog.csdn.net/shijizhe1/article/details/133777068
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号