防抖和节流的区别和举例(简要说明、形象比喻、容易理解)

1、含义:

在前端开发技术中,防抖(Debounce)和节流(Throttle)是两种常用的性能优化技术,主要用于处理高频事件触发,如用户的点击、滚动、输入等操作。

防抖(Debounce)的含义:

在一定时间内,多次触发同一个事件,但只有在最后一次触发后,经过指定的等待时间,才会执行相应的事件处理函数。如果在等待时间内再次触发了该事件,则会重新开始计时,取消之前的执行计划。这种方式适用于需要等待用户停止操作后再执行的场景,比如输入框输入完成后进行搜索、窗口大小调整完成后执行布局调整等。

节流(Throttle)的含义:

在一定时间内,多次触发同一个事件,但只会执行一次事件处理函数,无论这个事件被触发了多少次。这样可以确保函数不会因为频繁触发而过于密集地执行,从而控制函数的执行频率。节流适用于需要控制函数执行频率的场景,比如滚动事件处理、鼠标移动事件、页面滚动加载等。

在前端开发中,防抖和节流可以通过原生JavaScript实现,也可以使用第三方库来实现。它们都是提高页面性能和用户体验的重要技术手段。

需要注意的是,防抖和节流虽然都可以限制函数的执行频率,但它们的工作原理和适用场景有所不同。在实际开发中,需要根据具体的需求和场景来选择使用哪种技术。

2、区别:

防抖和节流的区别如下:

防抖(debounce):在事件被频繁触发的情况下,防抖可以保证一定时间内只触发一次回调,并且是在事件触发结束后的一定时间内触发。

如果在这个时间内再次触发事件,那么会重新计算时间,直到事件停止触发后才会执行回调。这就像坐公交车,只有当乘客都上车后,司机才会开车,如果期间有新的乘客上车,司机会等待所有乘客上车后再出发。

节流(throttle):在事件被频繁触发的情况下,节流可以保证在一定时间内只触发一次回调。

与防抖不同的是,节流是每隔一段时间就执行一次回调,而不是在事件停止触发后执行。这就像人的眨眼睛,每隔一段时间就会眨一次,不管期间发生了什么。 总的来说,防抖和节流都是为了减少事件触发频率,优化性能。但是,防抖更注重于在事件停止触发后执行回调,而节流则是每隔一段时间就执行一次回调。在具体的应用场景中,可以根据需要选择合适的方法。

3、举例:

在vue2项目中,写一个防抖方法:

在Vue 2中,你可以创建一个防抖方法并将其用于处理频繁触发的事件。防抖通常用于限制事件触发的频率,确保在一段时间内只执行一次处理函数。以下是一个简单的防抖函数的实现,并展示如何在Vue组件中使用它:

首先,在Vue组件的methods中定义一个防抖函数:

javascript
export default {
  data() {
    return {
      // ... your data properties
    };
  },
  methods: {
    debounce(func, wait) {
      let timeout;
      return function() {
        const context = this;
        const args = arguments;
        clearTimeout(timeout);
        timeout = setTimeout(function() {
          func.apply(context, args);
        }, wait);
      };
    },
    // ... your other methods
    handleDebouncedEvent() {
      // 这里是防抖后的事件处理逻辑
      console.log('Debounced event handled!');
    },
  },
  // ... your other options
};

在上面的代码中,debounce 函数接受一个需要防抖的函数 func 和一个等待时间 wait(以毫秒为单位)。它返回一个新的函数,这个新函数会在指定的等待时间后执行 func,如果在这段等待时间内再次调用新函数,那么会取消之前的定时器并重新设置。

现在,你可以在模板中绑定一个事件,并使用这个防抖函数来包裹你的事件处理函数:

html
<template>
  <div>
    <!-- 假设你有一个输入框,并希望在用户停止输入一段时间后执行某个操作 -->
    <input type="text" v-model="inputValue" @input="handleDebouncedInput" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      inputValue: '',
    };
  },
  methods: {
    debounce(func, wait) {
      // ... 防抖函数的实现(同上)
    },
    handleDebouncedInput: this.debounce(function() {
      // 输入防抖处理逻辑
      console.log('User stopped typing:', this.inputValue);
    }, 500), // 等待500毫秒后执行
  },
};
</script>

注意,在上面的handleDebouncedInput方法中,我们直接将防抖函数的结果(即新函数)赋值给了它。这样,每当输入框的input事件被触发时,实际上调用的是防抖包装后的函数。

不过,请注意,上面的代码在methods中直接使用了this.debounce,这可能会导致一些问题,因为this的上下文在箭头函数和普通函数中是不同的。为了确保this指向组件实例,我们可以使用箭头函数或者在组件的created或mounted生命周期钩子中绑定防抖函数。

以下是一个更稳妥的做法,在created钩子中绑定防抖函数:

javascript
export default {
  data() {
    return {
      inputValue: '',
      // ... your other data properties
    };
  },
  created() {
    this.handleDebouncedInput = this.debounce(this.handleActualInput, 500);
  },
  methods: {
    debounce(func, wait) {
      // ... 防抖函数的实现(同上)
    },
    handleActualInput() {
      // 实际的输入处理逻辑
      console.log('User stopped typing:', this.inputValue);
    },
  },
};

在模板中,你仍然绑定handleDebouncedInput作为输入事件的处理函数:

html
<input type="text" v-model="inputValue" @input="handleDebouncedInput" />

这样,当用户在输入框中输入时,实际的handleActualInput方法只会在用户停止输入500毫秒后执行一次。

在vue2项目中,写一个节流方法:

在Vue 2中,你可以编写一个节流(throttle)方法,用于限制某个函数在一段时间内的执行频率。这对于优化性能非常有用,尤其是在处理高频事件(如滚动、鼠标移动等)时。

下面是一个简单的节流方法实现,你可以将其放在Vue组件的methods中或者作为工具函数使用:

javascript
export function throttle(func, delay) {
  let lastCall = 0;
  return function(...args) {
    const now = new Date().getTime();
    if (now - lastCall < delay) {
      return;
    }
    lastCall = now;
    return func.apply(this, args);
  }
}

在上面的代码中,throttle函数接受两个参数:要节流的函数func和节流时间间隔delay(以毫秒为单位)。它返回一个新的函数,该函数在每次调用时会检查自上次调用以来是否已经过了指定的时间间隔。如果是,则执行原始函数;否则,直接返回并忽略调用。

你可以在Vue组件中使用这个节流方法,例如:

javascript
<template>
  <div>
    <button @click="throttledMethod">点击我</button>
  </div>
</template>

<script>
import { throttle } from './throttle';

export default {
  methods: {
    originalMethod() {
      console.log('方法被调用');
      // 在这里执行你的逻辑
    },
    throttledMethod: throttle(this.originalMethod, 200) // 设置节流时间间隔为200毫秒
  }
};
</script>

在上面的例子中,我们定义了一个originalMethod方法,它会在控制台中打印一条消息。然后,我们使用throttle方法创建了一个节流版本的originalMethod,即throttledMethod。当用户点击按钮时,会触发throttledMethod,但由于我们设置了200毫秒的节流时间间隔,所以originalMethod的实际执行频率会被限制在这个时间间隔内。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux系统】文件与基础IO

本篇博客整理了文件与文件系统、文件与IO的相关知识&#xff0c;借由库函数、系统调用、硬件之间的交互、操作系统管理文件的手段等&#xff0c;旨在让读者更深刻地理解“Linux下一切皆文件”。 【Tips】文件的基本认识 文件 内容 属性。文件在创建时就有基本属性&#xff0…

Ribbon负载均衡(自己总结的)

文章目录 Ribbon负载均衡负载均衡解决的问题不要把Ribbon负载均衡和Eureka-Server服务器集群搞混了Ribbon负载均衡代码怎么写ribbon负载均衡依赖是怎么引入的&#xff1f; Ribbon负载均衡 负载均衡解决的问题 首先Ribbon负载均衡配合Eureka注册中心一块使用。 在SpringCloud…

Packet Tracer-HSRP+DHCPv4+VLAN间路由+以太通道综合实验

实验拓扑&#xff1a; 实验内容&#xff1a; VLAN及VLAN间路由的配置&#xff0c;以太通道的配置&#xff0c;STP的根调整&#xff0c;DHCPv4的配置&#xff0c;首跳冗余HSRP的配置。 实验最终结果&#xff1a; PC可以自动获取到DHCP-Server分配的IP地址&#xff0c;实现首跳…

【MySQL精通之路】InnoDB(5)-内存结构

总目录&#xff1a; 【MySQL精通之路】InnoDB存储引擎-CSDN博客 上一篇&#xff1a; 【MySQL精通之路】InnoDB(4)-架构图-CSDN博客 目录 ​编辑 1 缓存池&#xff08;Buffer Pool&#xff09; 1.1 缓存池LRU算法 1.2 缓存区配置 1.3 使用InnoDB标准监视器监视缓存池 …

Kettle简介

一、Kettle简介 Kettle是一个开源的ETL&#xff08;Extract-Transform-Load的缩写&#xff0c;即数据抽取、转换、装载的过程&#xff09;项目。 项目名很有意思&#xff0c;水壶。按项目负责人Matt的说法&#xff1a;把各种数据放到一个壶里&#xff0c;然后呢&#xff0c;以…

【Crypto】Rabbit

文章目录 一、Rabbit解题感悟 一、Rabbit 题目提示很明显是Rabbit加密&#xff0c;直接解 小小flag&#xff0c;拿下&#xff01; 解题感悟 提示的太明显了

【Pixso如何对设计好的UI进行切片导出图片文件】

当软件UI设计好之后&#xff0c;并不是直接把设计图给开发就可以了&#xff0c;开发还会向你要各种图标的图片文件&#xff0c;这个时候就要用到”切片”功能了。 1、目的&#xff1a;把所有UI界面的图标都切下来&#xff0c;做成UI图标文件夹 2、在UI界面点击【】-【切片】-‘…

【linux】linux中免交互命令expect原理与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

聚恒中台系统 data.ashx SQL注入致RCE漏洞复现

0x01 产品简介 聚恒中台是山东聚恒网络技术有限公司打造的一款BPM流程管理系统,平台以低代码敏捷开发、流程协同、移动互联、软硬互联、大数据分析等前沿技术为支撑,平台包含8大引擎、16种业务组件,支持三种部署方式,四级权限控制,五大应用模式(PC、手机、PDA、工业平板…

基于EBAZ4205矿板的图像处理:07sobel边缘检测算法

基于EBAZ4205矿板的图像处理&#xff1a;07sobel边缘检测算法 项目文件 随后会上传项目全部文件&#xff0c;和之前一样免费下载 先看效果 如上所见&#xff0c;能够提取图像的边缘&#xff0c;这个sobel边缘检测算法的阈值&#xff08;认定是否为边缘的阈值&#xff09;一样…

与WAF的“相爱相杀”的RASP

用什么来保护Web应用的安全&#xff1f; 猜想大部分安全从业者都会回答&#xff1a;“WAF&#xff08;Web Application Firewall,应用程序防火墙&#xff09;。”不过RASP&#xff08;Runtime Application Self-Protection&#xff0c;应用运行时自我保护&#xff09;横空出世…

设计模式14——组合模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用&#xff0c;主要是下面的UML图可以起到大作用&#xff0c;在你学习过一遍以后可能会遗忘&#xff0c;忘记了不要紧&#xff0c;只要看一眼UML图就能想起来了。同时也请大家多多指教。 组合模式&#xff08;Composit…

C++ 写的_string类,兼容std::string, MFC CString和 C# 的string

代码例子&#xff1a; using namespace lf; int main() { CString s1 _t("http://www.csdn.net"); _string s2 s1; CString s3 s2; _pcn(s1); _pcn(s2); _pcn(s3); return 0; } 输出&#xff1a; _Str.h /***************************************…

Hsql每日一题 | day02

前言 就一直向前走吧&#xff0c;沿途的花终将绽放~ 题目&#xff1a;主播同时在线人数问题 如下为某直播平台主播开播及关播时间&#xff0c;根据该数据计算出平台最高峰同时在线的主播人数。 id stt edt 1001,2021-06-14 12:12:12,2021-06-14 18:1…

前端加载excel文件数据 XLSX插件的使用

npm i xlsx import axios from axios; axios //这里用自己封装的http是不行的&#xff0c;踩过坑.get(url,{ responseType: "arraybuffer" }).then((re) > {console.log(re)let res re.datavar XLSX require("xlsx");let wb XLSX.read(r…

【qt】标准项模型

标准项模型 一.使用标准型项模型1.应用场景2.界面拖放3.创建模型4.配套模型5.视图设置模型6.视图属性的设置 二.从文件中拿到数据1.文件对话框获取文件名2.创建文件对象并初始化3.打开文件对象4.创建文本流并初始化5.读取文本流6.关闭文件7.完整代码 三.为模型添加数据1.自定义…

【资料分享】你敢相信这些高大上的BI仪表盘都是用EXCEL做出来的?!

引言 现在大家都知道数据可视化、数据看板&#xff0c;几乎每个公司部门都有仪表盘的需求。 近年来&#xff0c;学习可视化软件的人也越来越多&#xff0c;国外Tableau、PowerBI就是这一领域的领先者&#xff0c;而国内也有不少厂家在研发数据可视化软件&#xff0c;比如帆软…

【C++】c++入门(下 )

c入门 1.内联函数1.1 概念1.2 特性 2.auto关键字(C11)2.1 简介2.2 auto的使用2.3 auto不能推导的场景2.4 typedef取别名也能产生和auto的效果&#xff0c;为什么不使用&#xff1f; 3.基于范围的for循环(C11)3.1 9.1 范围for的语法3.2 范围for的使用条件 4.指针空值nullptr(C11…

CSS3 新增背景属性 + 新增边框属性(如果想知道CSS3新增背景属性和新增边框属性的知识点,那么只看这一篇就够了!)

前言&#xff1a;CSS3在CSS2的基础上&#xff0c;新增了很多强大的新功能&#xff0c;从而解决一些实际面临的问题&#xff0c;本篇文章主要讲解的为CSS3新增背景属性和新增边框属性。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSD…

1分钟带你搞定Pandas DataFrame运算

1. DataFrame之间的运算 在运算中自动对齐不同索引的数据 如果索引不对应&#xff0c;则补NaN DataFrame没有广播机制 导包 # 导包import numpy as npimport pandas as pd 创建 DataFrame df1 不同人员的各科目成绩&#xff0c;月考一 # 创建DataFrame二维数组df1 pd.Da…