前端实现防抖功能的详细解读

在前端开发中,防抖(Debounce) 是一种优化技术,用于限制某个函数在短时间内被频繁调用的次数。它的核心思想是:在一定时间内,无论触发多少次事件,只执行最后一次操作。防抖通常用于处理用户输入、窗口调整、滚动事件等高频触发的场景,以减少不必要的计算或请求,提升性能。

1. 防抖的应用场景

常见场景

  1. 搜索框输入

    • 当用户在搜索框中输入内容时,每次按键都会触发搜索请求。如果不做防抖处理,可能会导致大量不必要的请求。

    • 使用防抖后,只有在用户停止输入一段时间后,才会触发搜索请求。

  2. 窗口调整(resize)

    • 当用户调整浏览器窗口大小时,会频繁触发 resize 事件。

    • 使用防抖后,只有在用户停止调整窗口大小一段时间后,才会执行相关逻辑。

  3. 滚动事件(scroll)

    • 当用户滚动页面时,会频繁触发 scroll 事件。

    • 使用防抖后,只有在用户停止滚动一段时间后,才会执行相关逻辑。

  4. 按钮点击

    • 当用户快速点击按钮时,可能会触发多次点击事件。

    • 使用防抖后,只有在用户停止点击一段时间后,才会执行点击逻辑。

2. 防抖的实现原理

防抖的核心原理是:

  • 设置一个定时器,在事件触发后等待一段时间。

  • 如果在这段时间内再次触发事件,则清除之前的定时器,重新开始计时。

  • 只有当事件停止触发一段时间后,才会执行目标操作。

3. 防抖的实现代码

原生 JavaScript 实现

function debounce(func, delay) {let timeout;return function (...args) {clearTimeout(timeout); // 清除之前的定时器timeout = setTimeout(() => {func.apply(this, args); // 在延迟后执行目标函数}, delay);};
}

使用示例

function onInput() {console.log('Input value:', document.getElementById('search').value);
}const debouncedInput = debounce(onInput, 300);document.getElementById('search').addEventListener('input', debouncedInput);

解释:

  • debounce 函数返回一个新的函数,这个新函数会在事件停止触发 delay 毫秒后执行目标函数 func

  • 每次事件触发时,都会清除之前的定时器并重新开始计时。

Vue 3 中使用 customRef 实现防抖

import { customRef } from 'vue';function useDebouncedRef(value, delay = 300) {let timeout;return customRef((track, trigger) => {return {get() {track(); // 追踪依赖return value;},set(newValue) {clearTimeout(timeout); // 清除之前的定时器timeout = setTimeout(() => {value = newValue; // 更新值trigger(); // 触发更新}, delay);},};});
}// 在组件中使用
export default {setup() {const debouncedValue = useDebouncedRef('');return {debouncedValue,};},
};

解释:

  • useDebouncedRef 是一个自定义的防抖 ref

  • 在 set 方法中,使用 setTimeout 延迟更新值,从而实现防抖效果。

4. 防抖与节流的区别

特性防抖(Debounce)节流(Throttle)
定义在事件停止触发一段时间后执行一次操作在一定时间间隔内只执行一次操作
适用场景输入框搜索、窗口调整、滚动事件等滚动事件、鼠标移动、按钮点击等
核心逻辑每次触发事件时重置定时器在一定时间间隔内只执行一次操作
执行时机事件停止触发后执行按照固定时间间隔执行

5. 防抖的实际应用示例

示例 1:搜索框防抖

<input type="text" id="search" placeholder="Search..." /><script>function debounce(func, delay) {let timeout;return function (...args) {clearTimeout(timeout);timeout = setTimeout(() => {func.apply(this, args);}, delay);};}function search() {const query = document.getElementById('search').value;console.log('Searching for:', query);// 这里可以发起搜索请求}const debouncedSearch = debounce(search, 300);document.getElementById('search').addEventListener('input', debouncedSearch);
</script>

解释:

  • 用户在搜索框中输入内容时,只有在停止输入 300 毫秒后,才会触发搜索逻辑。

示例 2:窗口调整防抖

function debounce(func, delay) {let timeout;return function (...args) {clearTimeout(timeout);timeout = setTimeout(() => {func.apply(this, args);}, delay);};
}function onResize() {console.log('Window resized:', window.innerWidth, window.innerHeight);
}const debouncedResize = debounce(onResize, 200);window.addEventListener('resize', debouncedResize);

解释:

  • 当用户调整窗口大小时,只有在停止调整 200 毫秒后,才会触发 onResize 逻辑。

6. 总结

  • 防抖 是一种优化技术,用于限制函数在短时间内被频繁调用的次数。

  • 它的核心思想是:在一定时间内,无论触发多少次事件,只执行最后一次操作。

  • 防抖常用于处理用户输入、窗口调整、滚动事件等高频触发的场景。

  • 通过防抖,可以减少不必要的计算或请求,提升性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/70067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通俗诠释 DeepSeek-V3 模型的 “671B” ,“37B”与 “128K”,用生活比喻帮你理解模型的秘密!

欢迎来到涛涛聊AI。 在DeepSeek-V3模型的参数描述中&#xff0c;你可能会看到类似“671B 37B 128K”这样的标记。这些字母和数字的组合看起来像密码&#xff0c;但其实它们揭示了模型的“大脑容量”和“工作方式”。我们用日常生活的比喻来解释&#xff1a; 一、数字含义&…

node.js + html调用ChatGPTApi实现Ai网站demo(带源码)

文章目录 前言一、demo演示二、node.js 使用步骤1.引入库2.引入包 前端HTML调用接口和UI所有文件总结 前言 关注博主&#xff0c;学习每天一个小demo 今天是Ai对话网站 又到了每天一个小demo的时候咯&#xff0c;前面我写了多人实时对话demo、和视频转换demo&#xff0c;今天…

unity学习42:动画状态机:混合动画状态 blend tree

目录 1 动画状态机 1.1 新建动画状态 2 混合动画状态 blend Tree 2.1 new blend Tree 2.2 blend tree state 和普通的 state的属性不同 2.3 双击blend tree 进入下一层 blend tree内部 2.3.1 blend tree 内部 2.3.2 blend type 2.3.3 参数类型默认是float&#xff0…

集成测试总结文档

1. 集成测试的定义 集成测试&#xff08;Integration Testing&#xff09;是在单元测试之后&#xff0c;将多个独立的软件模块或组件组合在一起进行测试的过程&#xff0c;目的是验证这些模块之间的接口、数据传递、协作逻辑是否符合设计要求&#xff0c;并发现因集成引发的缺…

Mybatisplus——Mybatisplus3.5.2版本使用Page分页插件查询,records有数据但是total显示0

目录 一、问题背景 debug 执行Mybatisplus使用Page分页插件查询时&#xff0c;发现 Page 里面的records有数据但是total显示0。 二、问题产生的原因 未配置MybatisPlus的分页插件拦截器导致的或者因mybatis-plus版本3.4或3.5版本导致原先的分页插件paginationInterceptor无法…

Android10 音频参数导出合并

A10 设备录音时底噪过大&#xff0c;让音频同事校准了下&#xff0c;然后把校准好的参数需要导出来&#xff0c;集成到项目中&#xff0c;然后出包&#xff0c;导出方式在此记录 设备安装debug系统版本调试好后&#xff0c; adb root adb remount adb shell 进入设备目录 导…

C#(Winform)通过添加AForge添加并使用系统摄像机

先展示效果 AForge介绍 AForge是一个专门为开发者和研究者基于C#框架设计的, 也是NET平台下的开源计算机视觉和人工智能库 它提供了许多常用的图像处理和视频处理算法、机器学习和神经网络模型&#xff0c;并且具有高效、易用、稳定等特点。 AForge主要包括: 计算机视觉与人…

后端开发:高效数据库查询优化实战指南

在后端开发中&#xff0c;数据库查询性能直接影响整个应用的响应速度和用户体验。低效的查询可能导致系统响应缓慢&#xff0c;甚至出现卡顿现象。本文将深入探讨数据库查询优化的实用技巧&#xff0c;并结合代码示例&#xff0c;帮助开发者提升数据库操作的效率。 一、理解查…

【视频总结】Deep Dive into LLMs like ChatGPT 深入探索像ChatGPT这样的大语言模型|Andrej Karpathy

【视频总结】Deep Dive into LLMs like ChatGPT 深入探索像ChatGPT这样的大语言模型&#xff5c;Andrej Karpathy 大型语言模型&#xff08;LLM&#xff09;工作原理与使用指南核心观点模型训练三阶段1. 预训练阶段2. 后训练阶段&#xff08;Post-training&#xff09;3. 强化学…

【苍穹外卖】学习

软件开发整体介绍 作为一名软件开发工程师,我们需要了解在软件开发过程中的开发流程&#xff0c; 以及软件开发过程中涉及到的岗位角色&#xff0c;角色的分工、职责&#xff0c; 并了解软件开发中涉及到的三种软件环境。那么这一小节&#xff0c;我们将从 软件开发流程、角色…

【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十五节】

ISO 14229-1:2023 UDS诊断服务测试用例全解析&#xff08;RoutineControl_0x31服务&#xff09; 作者&#xff1a;车端域控测试工程师 更新日期&#xff1a;2025年02月14日 关键词&#xff1a;UDS协议、0x31服务、例程控制、ISO 14229-1:2023、ECU测试 一、服务功能概述 0x31服…

yanshee机器人初次使用说明(备注)-PyCharm

准备 需要&#xff1a; 1&#xff0c;&#xff08;优必选&#xff09;yanshee机器人Yanshee 开发者说明 2&#xff0c;手机-联网简单操控 / HDMI线与显示器和键鼠标-图形化开发环境 / 笔记本&#xff08;VNC-内置图形化开发环境/PyCharm等平台&#xff09;。 3&#xff0c;P…

#渗透测试#批量漏洞挖掘#致远互联AnalyticsCloud 分析云 任意文件读取

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

win11 MBR 启动 如何把我的硬盘改 GPT win11 的 UEFI 启动

bootrec /fixboot bootrec /rebuildbcd bootrec /scanos 相当于你的硬盘从MBR转换为GPT&#xff0c;并从传统的BIOS启动&#xff08;即MBR&#xff09;转换为UEFI启动&#xff08;即GPT&#xff09;&#xff0c;你需要执行以下步骤。请注意&#xff0c;这些步骤涉及数据操作&a…

Flask框架入门完全指南

一、初识Flask&#xff1a;轻量级框架的魅力 1.1 Flask框架定位 Flask作为Python最受欢迎的轻量级Web框架&#xff0c;以"微核心可扩展"的设计哲学著称。其核心代码仅约2000行&#xff0c;却支持通过扩展实现完整Web开发功能。这种设计使得开发者可以&#xff1a; …

SQL与数据库程序设计

1.1986年&#xff0c;10月美国国家标准局颁布了SQL语言的美国标准&#xff0c;称为SQL86 2.SQL(Structured Query Language)又称为结构化查询语言 3.建立索引的主要目的是加快查找的速度 4.在基本表上建立一个或者多个索引 5. 一个基本表是最多只能建立一个聚簇索引 6.CAL…

Windows Server 中配置 Active Directory:从零到精通

Windows Server 中配置 Active Directory:从零到精通 引言 在企业 IT 基础架构中,Active Directory(AD)扮演着至关重要的角色。它是 Windows Server 提供的一种目录服务,能够集中管理用户、计算机和权限。对于初学者来说,搭建 Active Directory 可能会觉得复杂,但实际…

c#模拟鼠标点击左键

c#模拟鼠标点击左键&#xff0c;这里调用的是windows系统函数&#xff0c; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks;namespace WindowsFormsAppHalconJ…

时间序列分析(四)——差分运算、延迟算子、AR(p)模型

此前篇章&#xff1a; 时间序列分析&#xff08;一&#xff09;——基础概念篇 时间序列分析&#xff08;二&#xff09;——平稳性检验 时间序列分析&#xff08;三&#xff09;——白噪声检验 一、差分运算 差分运算的定义&#xff1a;差分运算是一种将非平稳时间序列转换…

信息收集-Web应用JS架构URL提取数据匹配Fuzz接口WebPack分析自动化

知识点&#xff1a; 1、信息收集-Web应用-JS提取分析-人工&插件&项目 2、信息收集-Web应用-JS提取分析-URL&配置&逻辑 FUZZ测试 ffuf https://github.com/ffuf/ffuf 匹配插件 Hae https://github.com/gh0stkey/HaE JS提取 JSFinder https://github.com/Threez…