当前位置: 首页 > news >正文

JS防抖是什么?干嘛用的?

你好同学,我是沐爸,欢迎点赞、收藏和关注!个人知乎

防抖在前端开发中可以说经常用到,有诸多使用场景。接下来我们一起看下防抖的定义、防抖函数的实现、应用场景、lodash防抖函数以及防抖在框架中的使用。Let’s go

一、什么是防抖?

什么是防抖?防抖技术确保函数在指定的时间间隔结束后才执行,如果在该间隔内有多次调用,则只会执行最后一次调用。
通俗点讲,以按钮点击为例,设置频率为1s,那么如果相邻两次的点击事件的时间间隔小于1s,理论上你可以一直点下去,点击要执行的函数永远不会触发;如果你只点了一次,或者两次点击的时间间隔大于等于1s,那么函数就会执行。

二、函数实现

function debounce(fn, wait) {let timeout = null;return function() {clearTimeout(timeout);timeout = setTimeout(() => {fn.apply(this, arguments);}, wait);};
}// 使用示例:方式一
window.addEventListener('resize', debounce(function() {console.log('窗口大小改变');
}, 200));// 使用示例:方式二
function onWindowResize() {console.log('窗口大小改变');
}
window.addEventListener('resize', debounce(onWindowResize, 200));

三、应用场景

1.搜索框输入

当用户在搜索框中键入时,通常希望在用户停止输入一定时间后再去请求搜索结果,以减少请求次数。

function onSearchInput() {console.log('搜索词:', this.value);
}const searchInput = document.querySelector('.search-input');
searchInput.addEventListener('input', debounce(onSearchInput, 300));

2.窗口调整大小

在用户调整浏览器窗口大小时,可能需要根据最终的尺寸执行一些操作,如重新计算布局或重新加载资源。

// 假设 myChart 是一个 ECharts 实例
const myChart = echarts.init(document.getElementById('myChart'));// 对图表进行初始化操作,如设置选项等
myChart.setOption(/* ... */);// 定义一个函数用于响应窗口大小变化
function onWindowResize() {myChart.resize(); // 调整图表尺寸以适应窗口大小
}// 使用防抖处理窗口调整大小事件
const debouncedResize = debounce(onWindowResize, 200);// 监听窗口调整大小事件
window.addEventListener('resize', debouncedResize);

3.表单验证

在用户填写表单时,可能希望在用户完成输入后进行验证,而不是每输入一个字符都进行验证。

function onFormInput() {// 执行表单验证逻辑console.log('输入内容验证');
}const formInput = document.querySelector('.form-input');
formInput.addEventListener('input', debounce(onFormInput, 500));

4.表单提交

防抖也经常会用于表单提交,用以限制用户手误导致的重复提交。

// 搜索函数
function handleSubmit() {console.log('执行搜索操作');// 执行搜索的逻辑
}// 将防抖应用于点击事件
const debouncedSubmit = debounce(handleSubmit, 300);// 给搜索按钮添加点击事件监听器
searchButton.addEventListener('click', debouncedSubmit);

5.键盘事件处理

在处理键盘事件,如连续按键时,防抖可以确保在用户停止按键后执行操作,如提交搜索查询。

function onKeyPress() {console.log('按键事件');
}document.addEventListener('keydown', debounce(onKeyPress, 100));

6.文件预览

在选择文件后,可能需要在用户停止选择文件一段时间后才加载预览,以避免在文件选择过程中占用过多资源。

function onFileSelected() {console.log('文件选择完成');// 加载文件预览或处理文件
}const fileInput = document.querySelector('.file-input');
fileInput.addEventListener('change', debounce(onFileSelected, 300));

四、lodash防抖函数

Lodash 是一个流行的 JavaScript 实用工具库,它提供了很多现成的函数式编程工具,包括防抖(debounce)功能。Lodash 的 debounce 方法可以非常方便地实现函数的防抖。

import _ from 'lodash';function performSearch(query) {console.log('搜索:', query);// 执行搜索逻辑
}
const debouncedSearch = _.debounce(performSearch, 300);const searchInput = document.getElementById('search-input');
searchInput.addEventListener('input', (event) => {debouncedSearch(event.target.value);
});

五、防抖在框架中的使用

Vue 2 中的防抖使用

在Vue 2中,你可以使用debounce函数结合watch属性来实现防抖:

import _ from 'lodash';export default {data() {return {searchQuery: ''}},watch: {// 使用防抖函数包装 watch 属性searchQuery: _.debounce(function (newValue) {console.log('搜索查询更新:', newValue);// 执行搜索逻辑}, 300)},methods: {// 其他方法...}
}

Vue 3 中的防抖使用

Vue 3 引入了Composition API,提供了更多的灵活性。对Vu2的例子进行改写:

import _ from 'lodash';
import { reactive, watch } from 'vue';const state = reactive({searchQuery: ''
});const debouncedSearch = debounce((newValue) => {console.log('搜索查询更新:', newValue);// 执行搜索逻辑
}, 300);watch(() => state.searchQuery, (newValue, oldValue) => {debouncedSearch(newValue);
});

React 中防抖的使用

1.函数组件使用防抖函数
假设我们有一个搜索框,我们想要在用户停止输入300毫秒后才执行搜索操作:

import React, { useState, useCallback } from 'react';
import _ from 'lodash'; // 引入Lodash库const SearchComponent = () => {const [searchTerm, setSearchTerm] = useState('');// 使用 useCallback 钩子来记忆化防抖函数const debouncedSearch = useCallback(_.debounce((term) => {console.log('搜索:', term);// 执行搜索逻辑}, 300),[]);const handleInputChange = (event) => {// 当输入改变时,更新状态并触发防抖函数setSearchTerm(event.target.value);debouncedSearch(event.target.value);};return (<inputtype="text"value={searchTerm}onChange={handleInputChange}placeholder="输入搜索内容"/>);
};export default SearchComponent;

2.类组件使用防抖函数
在类组件中,你可以在componentDidMount生命周期方法中设置事件监听器,并在componentWillUnmount中清除它们:

import React, { Component } from 'react';
import _ from 'lodash';class SearchComponent extends Component {constructor(props) {super(props);this.state = {searchTerm: '',};this.debouncedSearch = _.debounce(this.handleSearch, 300);}handleSearch = (term) => {console.log('搜索:', term);// 执行搜索逻辑};handleInputChange = (event) => {const term = event.target.value;this.setState({ searchTerm: term }, () => {this.debouncedSearch(term);});};componentDidMount() {// 如果需要绑定事件,可以在此处进行}componentWillUnmount() {// 清除防抖函数的定时器this.debouncedSearch.cancel();}render() {const { searchTerm } = this.state;return (<inputtype="text"value={searchTerm}onChange={this.handleInputChange}placeholder="输入搜索内容"/>);}
}export default SearchComponent;

希望今天的分享对你有所帮助,下期再见!

相关文章:

JS防抖是什么?干嘛用的?

你好同学&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏和关注&#xff01;个人知乎 防抖在前端开发中可以说经常用到&#xff0c;有诸多使用场景。接下来我们一起看下防抖的定义、防抖函数的实现、应用场景、lodash防抖函数以及防抖在框架中的使用。Let’s go 一、什么是防…...

Linux磁盘管理与文件系统(二):实用工具和命令、fdisk分区示例

文章目录 4、查看或管理磁盘分区-fdisk格式选项示例 4、示例&#xff1a;使用 fdisk 命令创建分区需求操作步骤 5、创建文件系统-mkfs格式常用选项示例创建其他类型的文件系统 6、创建文件系统-mkswap格式常用选项示例拓展&#xff1a;关闭和启用交换分区拓展&#xff1a;swap分…...

使用vtkRenderer创建的显示点云的窗口如何刷新(QT/C++)

一、使用vtkRenderer创建点云显示窗口&#xff0c;参考 在Qt创建的UI中放一个显示点云的窗口&#xff08;PCLQT5&#xff09;_pcl点云和qt-CSDN博客 二、刷新vtkRenderer创建的窗口 使用场景&#xff1a;在某些情况下代码中需要对显示窗口的显示物改动&#xff0c;例如通过滑…...

Mysql绕过小技巧

上源码。 <?php $mysqli new mysqli("localhost", "root", "root", "security");/* check connection */ if ($mysqli->connect_errno) {printf("Connect failed: %s\n", $mysqli->connect_error);exit(); }$my…...

气象大数据案例项目(求各气象站的平均气温)

气象大数据案例项目&#xff08;求各气象站的平均气温&#xff09; 一、项目需求二、数据格式三、项目开发3.1 在windows 进行开发3.2 运行结果3.3 对项目打包 一、项目需求 现在有一份来自美国国家海洋和大气管理局的数据集&#xff0c;里面包含近30年每个气象站、每小时的天…...

博客摘录「 一个ModBus RTU程序(支持01、02、03、05、06、15、16功能码)」2024年4月19日

发送数据最好改为中断模式&#xff0c;不然通信速度不够。...

Vue3学习笔记第一天

MVVM Vue是一种用于构建用户界面的JavaScript框架。MVVM 是Vue采用的一种软件架构模式&#xff0c;用于构建交互式的用户界面。它的全称是 Model-View-ViewModel&#xff0c;这三个部分分别代表了应用程序的不同层次和角色&#xff1a; Model&#xff08;模型&#xff09;&…...

C++之类与对象(完结撒花篇)

目录 前言 1.再探构造函数 2.类型转换 3.static成员 4. 友元 5.内部类 6.匿名对象 7.对象拷贝时的编译器优化 结束语 前言 在前面的博客中&#xff0c;我们对类的默认成员函数都有了一定了解&#xff0c;同时实现了一个日期类对所学的没内容进行扩展延伸&#xff0c;本…...

代码质量的守护者:Python静态代码分析工具的集成之道

标题&#xff1a;代码质量的守护者&#xff1a;Python静态代码分析工具的集成之道 在软件开发过程中&#xff0c;代码质量是至关重要的一环。Python作为一种流行的编程语言&#xff0c;拥有众多的静态代码分析工具&#xff0c;它们能够在代码运行之前检测潜在的错误和代码风格…...

JVM -- 类加载器

类加载器(ClassLoader)是Java虚拟机提供给应用程序去实现访问接口和类字节码数据的技术。类加载器只负责加载过程中的字节码获取并加载到内存的这一过程。 一、 类加载器的分类 类加载器的详细信息可以使用Arthas通过classloader命令查看&#xff1a; 1.启动类加载器(Boots…...

OLAP引擎之StarRocks

StarRocks 是一款新兴的开源分布式实时分析型数据库&#xff0c;专为高性能、高并发的数据分析场景设计。它结合了传统数据仓库和大数据技术的优势&#xff0c;提供了强大的实时数据处理和分析能力。以下是对 StarRocks 的详细介绍&#xff0c;涵盖其基本概念、核心特性、架构设…...

基于微信小程序的小区业主服务系统(源码+论文+部署讲解等)

博主介绍&#xff1a;✌全网粉丝10W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术栈介绍&#xff1a;我是程序员阿龙&#xff…...

C++ | Leetcode C++题解之第327题区间和的个数

题目&#xff1a; 题解&#xff1a; class Solution { public:int countRangeSumRecursive(vector<long>& sum, int lower, int upper, int left, int right) {if (left right) {return 0;} else {int mid (left right) / 2;int n1 countRangeSumRecursive(sum,…...

C# Winform 多窗体切换方式一

一、简介 在 Winform 开发中&#xff0c;多窗体的切换是一个常见的需求&#xff0c;比如登录成功后&#xff0c;切换至主界面&#xff0c;在网上查阅相关的资料&#xff0c;你会发现很多都是用 form2.Show(); this.Hide(); 这种方式&#xff0c;这种方式也存在一些问题&#…...

笔记本CPU天梯图(2024年8月),含AMD/骁龙等新CPU

原文地址&#xff08;高清无水印原图/持续更新/含榜单出处链接&#xff09;&#xff1a; 2024年8月笔记本CPU天梯图 2024年8月笔记本CPU天梯图 2024年8月5日更新日志&#xff1a;常规更新Cinebench R23、PassMark笔记本CPU天梯图&#xff0c;新增Geekbench 6.2单核多核天梯图&…...

GitLab-CI/CD指南

由于公司没有运维&#xff0c;写go服务时各个环境编译部署还是略显麻烦&#xff0c;由于代码管理使用的是 gitlab&#xff0c;所以决定使用 gitlab 自带的 CI/CD 来做自动编译和部署&#xff0c;这样每次提交代码以后就可以自动部署到服务器上了。 gitlab 本身只有 CI/CD 的接…...

io目录操作学习

1、基本概念 目录也是一种文件&#xff0c;因此操作流程与普通文件类似&#xff0c;有诸如打开、关闭、定位等概念&#xff0c;但目录是一种特殊的文件&#xff0c;目录存储的数据的最小单位并不是字符&#xff0c;而是目录项。这使得目录跟普通文件又有区别。 在Linux中&…...

Ant-Design-Vue

Ant-Design-Vue是蚂蚁金服Ant Design官方推荐的Vue版UI组件库&#xff0c;它继承了Ant Design的设计语言和Vue.js的易用性&#xff0c;为开发者提供了丰富、高质量的Vue组件&#xff0c;极大地简化了前端开发流程。以下是一份详细的Ant-Design-Vue快速上手指南及排坑建议&#…...

2024互联网暑期实习面经和流程记录分享

2024互联网暑期实习面经和流程记录分享 面试经验和流程需要注意的点 面试经验和流程 因为敏感信息的原因&#xff0c;这里涉及到公司名字的全部进行打码 笔者投递和面试了很多公司&#xff0c;具体有包括算法和开发岗&#xff0c;下面的公司一律用字母代替。 O公司&#xff0…...

风云崛起之拉氏变换和拉式逆变换

图像的分割写出来了&#xff0c;但是写的不好&#xff0c;暂时先不发了。这两天小y想在把拉式变换的内容写出来&#xff0c;小y最近再看信号和电路&#xff0c;需要复习数学&#xff0c;所以把这点写出来。 首先要推出分布积分的公式&#xff0c;我们知道积分和微分为逆运算&am…...

1、.Net UI框架:WinUI - .Net宣传系列文章

WinUI(Windows UI Library)是微软提供的一个用于构建Windows应用程序的本机UI平台组件。它与Windows应用SDK紧密相关&#xff0c;允许开发者创建适用于Windows 10及更高版本的应用程序&#xff0c;并且可以发布到Microsoft Store。WinUI 3是最新的一代&#xff0c;它提供了与操…...

计算机的错误计算(五十九)

摘要 讨论用 Go语言实现的 函数的计算精度问题。 由计算机的错误计算&#xff08;五十五&#xff09;知&#xff0c;国际 IEEE 754 标准中&#xff0c; 函数具有定义域 . 那么&#xff0c;在常规编程模式下用 Go语言实现这个函数&#xff0c;其输出的精度如何&#xff1f; …...

【数学分析笔记】第1章第1节:集合(1)

作为一个计算机专业的人&#xff0c;想自学一下数学专业的专业课补一补AI基础&#xff0c;顺带写个笔记&#xff0c;听的课是陈纪修版本的数学分析&#xff1a; 1. 集合与映射 1.1 集合 1.1.1 基本概念 集合&#xff1a;由某种特定性质的具体的或抽象的对象汇集的总体。 集…...

计算机毕业设计 校园失物招领网站 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…...

GIT指令大全详解

目录 GIT指令详解 拉取 提交 分支操作(假设分支为a) 版本回退 主分支拉取到分支 常用的Git指令 一、初始化配置 二、初始化仓库 三、检查当前文件状态 四、添加 五、查看提交历史 六、撤销更改 七、查询 八、分支 九、标签管理 十、其他常用指令 GIT指令详解 Git是一个开源的分…...

ECCV2024,清华百度提出ReSyncer:可实现音频同步嘴唇动作视频生成。

清华&百度等联合提出了ReSyncer&#xff0c;可以实现更高稳定性和质量的口型同步&#xff0c;而且还支持创建虚拟表演者所必需的各种有趣属性&#xff0c;包括快速个性化微调、视频驱动的口型同步、说话风格的转换&#xff0c;甚至换脸。 ReSyncer的工作原理可以简单理解为…...

论文笔记:YOLOv8-QSD 自动驾驶场景小目标检测算法

摘要 YOLOv8-QSD网络是一种新型的无锚点驾驶场景检测网络&#xff0c;建立在YOLOv8的基础上&#xff0c;在保证检测精度的同时保持效率。该网络的骨干网采用结构重参数化技术来转换基于多样化分支块 &#xff08;DBB&#xff09; 的模型。 为了准确检测小目标&#xff0c;它集…...

Vue.js状态管理:Vuex与Pinia的比较

在 Vue.js 生态系统中&#xff0c;状态管理是构建复杂应用时的重要组成部分。Vue.js 提供了两种流行的状态管理库&#xff1a;Vuex 和 Pinia。虽然两者都旨在简化状态管理&#xff0c;但它们在设计哲学、API、性能和易用性方面有所不同。本文将深入探讨 Vuex 和 Pinia 的异同&a…...

OJ题目【栈和队列】

目录 有效的括号 有效的括号【代码】 用队列实现栈 用队列实现栈【代码】 用栈实现队列 用栈实现队列【代码】 设计循环队列 有效的括号 https://leetcode.cn/problems/valid-parentheses/submissions/551394950/ 思路&#xff1a;把左括号放到栈里&#xff0c;取出来栈…...

[shell][git]git将当前分支的HEAD指针重置到最后一次提交的状态

在Git中&#xff0c;git reset --hard HEAD 命令用于将当前分支的HEAD指针重置到最后一次提交的状态&#xff0c;并且会丢弃当前工作目录中的所有更改。这个命令的意思是&#xff1a; git reset&#xff1a;重置命令&#xff0c;用于将HEAD指针移动到指定的状态。--hard&#…...