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

2023-11-07

1. 出现问题

防抖/节流使用无效,(例如防抖,按钮点击多次依旧执行多次)
----> 查看是闭包无效,定义的局部变量依旧为初值
----> 没有相应清除定时器

  <el-button @click="btn1">按 钮1</el-button>
  <el-button @click="debounce(btn2)">按 钮2</el-button>
</template>

<script setup lang="ts">
// 以下方法调用不生效
const btn1 = () => {
  debounce(() => {
    console.log('点击了')
  }, 1000)()
}

const btn2 = () => {
  console.log('点击了');
}

</script>

2. 问题原因

直接调用了防抖函数

原因:这个和vue的事件绑定原理有关。如果直接在函数体内部使用的话,结果就是,一个匿名的立即执行函数来进行执行。由于每次触发点击事件都会返回一个新的匿名函数, 就会生成一个新的函数执行期上下文(称之为执行栈),所以就会防抖/节流就会失效

3. 解决办法

<template>
  <el-button @click="btn">按 钮1</el-button>
</template>

<script setup lang="ts">
const btn = debounce(function() {
  console.log('点击了');
},500)
</script>

4. 防抖节流函数

type DebouncedFn<T extends (...args: any[]) => any> = (this: ThisParameterType<T>, ...args: Parameters<T>) => void;

type ThrottledFn<T extends (...args: any[]) => any> = (this: ThisParameterType<T>, ...args: Parameters<T>) => void;

function debounce<T extends (...args: any[]) => any>(fn: T, delay: number, immediate = false): DebouncedFn<T> {
  let timer: number | null = null;
  return function(this: ThisParameterType<T>, ...args: Parameters<T>) {
    // if (timer !== null) clearTimeout(timer);
    timer && clearTimeout(timer)
    if (immediate) {
      const callNow = !timer;
      timer = setTimeout(() => {
        timer = null;
      }, delay);
      callNow && fn.apply(this, args);
    } else {
      timer = setTimeout(() => {
        fn.apply(this, args);
      }, delay);
    }
  };
}

function throttle<T extends (...args: any[]) => any>(fn: T, delay: number, immediate = false): ThrottledFn<T> {
  let lastCall = 0;
  return function(this: ThisParameterType<T>, ...args: Parameters<T>) {
    const now = new Date().getTime();
    // immediate 不为 true 时, 不立即执行
    lastCall === 0 && !immediate && (lastCall = now)
    const diff = now - lastCall;
    if (diff >= delay) {
      lastCall = now;
      fn.apply(this, args);
    }
  };
}

export {
  debounce,
  throttle
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • zkEVM战局简析:zkSync、StarkNet、Scroll和挑战者们

    不同的项目正在探索不同的方向 这或许是最利于行业的发展模式 原文作者 Grant Griffith 由 Odaily星球日报 Azuma 编译 编者按 10 月 28 日 由 Matter Labs 构建的以太坊扩容解决方案正式发布了 zk
  • JAVA之猜数字游戏

    1 随机生成一个0 99 包括0和99 的数字 从控制台输入猜测的数字 输出提示太大还是太小 继续猜测 直到猜到为止 游戏过程中 记录猜对所需的次数 游戏结束后公布结果 打开记事本 写如下一段代码 import java util Rand
  • SpringBoot2对接线程池

    SpringBoot2对接线程池 1 配置线程池Bean package com itennishy test config import java util concurrent ThreadPoolExecutor import org
  • Qt中extern全局变量的使用

    参考网址 https blog csdn net Soar dream article details 101025153 https blog csdn net weixin 45571586 article details 118109
  • C语言位操作

    C语言位操作 1 位与 按照二进制位一一对应 只有全1才为真 否则为假 特定位置置0用位与 2 位或 按照二进制 有真则真 全假才假 特定位置置1用位或 3 位取反 按照二进制位 1变为0 0变为1 逻辑取反 数当成整体 不变二进制 不是0
  • 错误 Angular2 Can't bind to 'routerLink' since it isn't a known property of 'a'

    Can t bind to routerLink since it isn t a known property of a 解决办法 检查是否没有 import RouterModule import RouterModule from a
  • 阿里java编程规范之异常处理、安全规约、MySql数据库

    注 本文内容整理自 阿里java编码规范 除 编程规约 外的其它规则 异常处理 强制 1 Java类库中可以通过预检查方式规避的 RuntimeException不应该通过catch的方式来处理 如 IndexOutOfBoundsExce
  • LruCache基本使用和原理分析

    最近在研究时区问题时 时区的底层实现涉及到BasicLruCache集合的使用 故而对LruCache做了部分的了解 BasicLruCache 是 Android 提供的一个简单的 LRU 缓存实现 但在标准的 Java 类库中并不存在
  • 基于SpringBoot的校园志愿者管理系统

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SpringBoot 前端 HTML Vue 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Eclipse
  • windows 安装 minio

    windows 安装 minio 1 通过powershell 安装 Invoke WebRequest Uri https dl min io server minio release windows amd64 minio exe Ou
  • 小试一下Google App Engine

    这两天关心了一下云 所以也看到google app engine了 今天小小试了一下 做下记录 主页 登录http code google com intl zh CN appengine 下载 App Engine SDK GoogleA
  • 使用StarRocks导入大数据:详细教程及示例代码

    使用StarRocks导入大数据 详细教程及示例代码 StarRocks是一个快速 可扩展的大数据分析引擎 它提供了高性能的数据导入功能 在本文中 我们将介绍如何使用StarRocks导入大数据 并提供相应的示例代码 步骤1 准备工作 在开
  • 云计算平台常用命令

    云计算IAAS篇 mysql篇 mysql uroot p000000 使用root账号登录mysql use mysql 切换到mysql层 show tables 查询mysql数据库列表 select from mysq
  • linux高性能服务器开发之TCP/IP协议族(1)

    TCP IP协议族体系结构以及主要协议 每层协议完成不一样的功能 上层协议得借助下层协议提供的服务 计网 数据链物层 数据链物层实现网卡接口的网络驱动程序 网络驱动程序隐藏一些 物理层不同电气特性 为上层提供一个统一的接口 常用的协议ARR
  • 【中兴ZXV10 B860A1.1】

    这里写自定义目录标题 开启adb 开启adb 部分盒子的ADB调试位置 在设置页面中可以有开启开发者选项 地区界面不同 位置不同有的在设置里 如果找不到 直接按住遥控器 返回 不放 5秒后 快速不停按 左键 点击 打开ADB调试 这时侯让你
  • 2021-08-04 读书笔记:Python 学习手册(2)

    读书笔记 Python 学习手册 2 结于2021 08 04 OREILY的书籍 可读性很强 入门类 而且这本书很厚 第三部分 语句和语法 第四部分 函数 第三部分 语句和语法 第10章 Python语句简介 Python是面向过程的 基
  • 程序或-内存区域分配(五个段)--终于搞明白了

    一 在学习之前我们先看看ELF文件 ELF分为三种类型 o 可重定位文件 relocalble file 可执行文件以及共享库 shared library 三种格式基本上从结构上是一样的 只是具体到每一个结构不同 下面我们就从整体上看看这
  • DC系列漏洞靶场-渗透测试学习复现(DC-1)

    最近闲着冲浪玩发现了DC系列漏洞靶场 下载了8个靶场 DC 1到DC 8 从信息收集到最后拿到超级管理员权限 可以说几乎贯穿了渗透测试的每一步 寻找一个个flag 通过flag中的指引内容 帮助我们拿到最后的root身份 过程还是挺有趣的
  • Jvm之垃圾回收机制

    判断一个对象是否可被回收 1 引用计数算法 给对象添加一个引用计数器 当对象增加一个引用时计数器加 1 引用失效时计数器减 1 引用计数为 0 的对象可被回收 两个对象出现循环引用的情况下 此时引用计数器永远不为 0 导致无法对它们进行回收
  • vue中使用闭包(例如防抖和节流)失效问题(直接调用)

    文章目录 1 出现问题 2 问题原因 3 解决办法 4 防抖节流函数 1 出现问题 防抖 节流使用无效 例如防抖 按钮点击多次依旧执行多次 gt 查看是闭包无效 定义的局部变量依旧为初值 gt 没有相应清除定时器