Vue实战技巧:从零开始封装全局防抖和节流函数

前言

你是否曾经遇到过用户频繁点击按钮或滚动页面导致反应迟钝的问题?这是因为事件被连续触发,导致性能下降。在本文中,我将为大家介绍 vue 中的防抖和节流策略,并展示如何封装全局的防抖节流函数,以避免频繁触发事件,提升页面的响应速度。


封装文件

封装文件的实现思路如下:

  • 首先,我们需要定义两个函数:防抖函数和节流函数。这两个函数的目的是为了减少频繁触发某个事件导致的性能问题;
  • 防抖函数的实现思路是创建一个计时器变量,用于延迟执行函数。当触发事件时,首先清空之前的计时器,然后创建一个新的计时器来延时执行函数。如果在延时期间再次触发事件,会清空之前的计时器并重新创建计时器;
  • 节流函数的实现思路是创建一个计时器变量,用于限制函数的调用频率。当触发事件时,如果计时器变量不存在,则立即执行函数,并创建一个计时器,在指定时间后重置计时器变量。如果在计时器未过期期间再次触发事件,则无效,不会再次执行函数;
  • 在函数内部使用闭包,可以保存变量的状态,使得每次触发事件时都能访问到正确的变量值;
  • 最后,通过 export 语句将防抖函数和节流函数导出,以便在其他地方使用。

封装文件的目的是将防抖和节流的逻辑封装在一个独立的文件中,方便在不同的项目中复用,并使代码更加可读和可维护。

// 防抖函数
function debounce(func, wait, immediate) {
    let timeout; // 定义一个计时器变量,用于延迟执行函数
    return function (...args) { // 返回一个包装后的函数
        const context = this; // 保存函数执行上下文对象
        const later = function () { // 定义延迟执行的函数
            timeout = null; // 清空计时器变量
            if (!immediate) func.apply(context, args); // 若非立即执行,则调用待防抖函数
        };
        const callNow = immediate && !timeout; // 是否立即调用函数的条件
        clearTimeout(timeout); // 清空计时器
        timeout = setTimeout(later, wait); // 创建新的计时器,延迟执行函数
        if (callNow) func.apply(context, args); // 如果满足立即调用条件,则立即执行函数
    };
}

// 节流函数
function throttle(func, wait) {
    let timeout; // 定义一个计时器变量,用于限制函数调用频率
    return function (...args) { // 返回一个包装后的函数
        const context = this; // 保存函数执行上下文对象
        if (!timeout) { // 如果计时器不存在
            func.apply(context, args); // 执行函数
            timeout = setTimeout(() => {
                timeout = null; // 清空计时器变量
            }, wait); // 创建计时器,在指定时间后重置计时器变量
        }
    };
}

export {
    debounce,
    throttle
}; // 导出防抖函数和节流函数

全局引入

main.js

// 引入防抖节流函数文件
import { debounce, throttle } from './utils/dbucTrtl.js';
// 在Vue实例上扩展全局方法
Vue.prototype.$debounce = debounce;
Vue.prototype.$throttle = throttle;

使用文件

当用户点击某个按钮时,我们可以使用防抖函数来避免用户误操作导致多次触发相同的事件。而节流函数可以限制用户点击按钮的频率,防止连续点击导致重复的操作。

下面是一个使用点击事件的防抖和节流函数的案例:

<template>
  <div>
    <button @click="debouncedClick">点击触发防抖函数</button>
    <button @click="throttledClick">点击触发节流函数</button>
  </div>
</template>

<script>
export default {
  created() {
    // 使用防抖函数处理点击事件
    this.debouncedClick = this.$debounce(this.handleClick, 1000);

    // 使用节流函数处理点击事件
    this.throttledClick = this.$throttle(this.handleClick, 1000);
  },
  methods: {
    handleClick() {
      console.log("按钮点击事件处理中...");
      // 在这里编写具体的点击事件处理逻辑
    },
  },
};
</script>

在以上例子中,有两个按钮,分别绑定了 @click 事件并调用不同的处理方法。debouncedClick 使用防抖函数来处理点击事件,延迟执行 handleClick 方法,以避免用户连续点击导致触发多次事件。throttledClick 使用节流函数来处理点击事件,限制用户点击按钮的频率,确保在一定时间内只触发一次事件。通过这些防抖和节流函数的应用,可以避免用户的误操作并提升用户体验。


实现效果

在这里插入图片描述


使用场景

防抖的使用场景:

  • 输入框搜索:当用户在输入框中输入文字时,防抖可以用来延迟搜索操作的执行,只在用户停止输入一段时间后执行搜索操作,减少无意义的搜索请求;
  • 窗口调整/滚动事件:在窗口调整大小或滚动的过程中,防抖可以防止事件被频繁触发,减少不必要的计算和重绘操作;
  • 表单验证:在表单输入验证时,防抖可以延迟验证操作的执行,只在用户完成输入一段时间后进行验证,避免频繁的验证操作;
  • 按钮点击:当用户点击一个按钮时,防抖可以用来避免用户误操作或者重复点击,确保只执行一次操作。

节流的使用场景:

  • 页面滚动:在页面滚动过程中,节流可以用来限制触发回调函数的频率,减少事件处理的次数,以避免过多的计算和渲染操作;
  • 鼠标移入/移出事件:在监听鼠标移入或移出某个元素的事件时,节流可以限制事件的触发频率,避免因为快速进入和离开导致频繁的函数调用;
  • 滑动操作:在监听滑动操作时,节流可以限制回调函数的触发频率,以便更好地控制滑动效果和动画的展示;
  • 请求发送:在发送网络请求时,节流可以用来控制请求的频率,以避免发送过多的请求造成服务器过载。

总的来说,防抖适合在需要避免频繁触发事件的场景下使用,而节流适合控制函数的调用频率,避免过多函数调用的场景下使用。


总结

防抖和节流是两种常见的优化技术,用于控制事件的触发频率,以提高性能和用户体验。

防抖它限制一个函数在连续触发事件后,只执行一次。当事件被触发时,防抖函数会设置一个定时器。如果在指定的时间内再次触发事件,定时器会被清除并重新设置。只有当事件停止触发一段时间后,定时器才会执行相应的函数。防抖常用于处理在用户频繁操作时的回调函数,例如在输入框输入时触发搜索操作。通过防抖,可以减少不必要的函数调用,提高性能。

节流它控制函数在一段时间内的触发频率。当事件触发时,节流函数会执行相应的回调函数,并设置一个定时器来限制在一段时间内无法再次触发事件。只有当指定的时间间隔过去后,才能再次触发函数。节流常用于处理用户频繁触发事件时的回调函数,例如在页面滚动时触发某些效果动画。通过节流,可以限制函数的调用频率,防止因频繁触发事件而导致性能问题。

综上所述,防抖和节流是对函数执行频率进行控制的技术。防抖限制连续触发事件后只执行一次函数,而节流控制在一段时间内只能触发一次函数。这两种技术都能够优化性能,并提供更好的用户体验。


相关推荐

⭐ 【全局优化】微信小程序全局封装防抖节流函数,让你的程序更加高效流畅

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

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

相关文章

米尔瑞萨RZ/G2L开发板-01 开箱+环境搭建+交叉编译FFMPEG

标题有点长哈&#xff0c;首先要感谢米尔电子提供的开发板&#xff0c;异构的板子说实话还真的是最近才开始接触的&#xff0c;在我提交申请后&#xff0c;很快就收到板子了&#xff0c;而且还是顺丰给发来的&#xff0c;其实我估计很多人就是为了骗板子&#xff0c;因为米尔的…

LeetCode150道面试经典题-移除元素(简单)

目录 1.题目 2.解题思路 3.解题代码 1.题目 移除元素 给你一个数组 nums 和一个值 val&#xff0c;你需要原地移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并原地修改输入数组。 元素…

Idea中侧面栏不见了,如何设置?

一、打开idea点击File然后点击Setting 二、点击Appearance,然后划到最下面&#xff0c;勾选Show tool windows bars和Side-by-side layout on the left 三、侧面栏目正常显示

Chatgpt AI newbing作画,文字生成图 BingImageCreator 二次开发,对接wxbot

开源项目 https://github.com/acheong08/BingImageCreator 获取cookie信息 cookieStore.get("_U").then(result > console.log(result.value)) pip3 install --upgrade BingImageCreator import os import BingImageCreatoros.environ["http_proxy"]…

微信小程序的项目解构

视频链接 黑马程序员前端微信小程序开发教程&#xff0c;微信小程序从基础到发布全流程_企业级商城实战(含uni-app项目多端部署)_哔哩哔哩_bilibili 接口文档 https://www.escook.cn/docs-uni-shop/mds/1.start.html 1&#xff1a;微信小程序宿主环境 1&#xff1a;常见的宿…

无涯教程-Perl - index函数

描述 此函数返回STR中第一次出现的SUBSTR的位置,该位置从开头(从零开始)开始,或者从POSITION(如果指定)开始。 语法 以下是此函数的简单语法- index STR, SUBSTR, POSITIONindex STR, SUBSTR返回值 失败时此函数返回-1,否则返回匹配字符串的位置(第一个字符从零开始)。 例…

【从0开始离线数仓项目】——数据仓库的环境搭建(1)

目录 一、服务器环境准备 1.2 编写集群分发脚本xsync 1.3 SSH无密登录配置 1.4 JDK准备 1.5 环境变量配置说明 二、集群所有进程查看脚本 三、Zookeeper安装 3.1 分布式安装部署 3.2 ZK集群启动停止脚本 3.3 客户端命令行操作 一、服务器环境准备 CentOS 7 怎么从命…

【uniapp】一文读懂app端安装包升级

一、前言 首先&#xff0c;在app端开发上线的过程中&#xff0c;会面临一个问题&#xff0c;就是关于app端的版本升级的问题。如果不做相关处理来引导用户的话&#xff0c;那么app就会出现版本没有更新出现的各种问题&#xff0c;我们常见的有在线升级和去指定地址下载安装两种…

web-xss

一、简介 XSS 又称CSS(Cross Site Scripting)或跨站脚本攻击&#xff0c;攻击者在网页中插入由JavaScript编写的恶意代码&#xff0c;当用户浏览被嵌入恶意代码的网页时&#xff0c;恶意代码将会在用户的浏览器上执行。 二、xss的攻击方式 Dom&#xff1a;这是一种将任意 Jav…

hive on tez资源控制

sql insert overwrite table dwintdata.dw_f_da_enterprise2 select * from dwintdata.dw_f_da_enterprise; hdfs文件大小数量展示 注意这里文件数有17个 共计321M 最后是划分为了21个task 为什么会有21个task&#xff1f;不是128M 64M 或者说我这里小于128 每个文件一个map…

【web逆向】全报文加密流量的去加密测试方案

aHR0cHM6Ly90ZGx6LmNjYi5jb20vIy9sb2dpbg 国密混合 WEB JS逆向篇 先看报文&#xff1a;请求和响应都是全加密&#xff0c;这种情况就不像参数加密可以方便全文搜索定位加密代码&#xff0c;但因为前端必须解密响应的密文&#xff0c;因此万能的方法就是搜索拦截器&#xff0c…

Springboot中创建拦截器

目录 目的 实现过程 1、创建拦截器 2、注册拦截器 完整代码 目的 在Springboot项目中创建拦截器&#xff0c;在进入Controller层之前拦截请求&#xff0c;可对拦截到的请求内容做响应处理&#xff0c;如&#xff1a;校验请求参数、验证证书等操作&#xff1b; 实现过程 1、创…

基于Java+SpringBoot+Vue的数码论坛系统设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

用于3D MRI和CT扫描的深度学习模型总结

医学成像数据与其他我们日常图像的最大区别之一是它们很多都是3D的&#xff0c;比如在处理DICOM系列数据时尤其如此。DICOM图像由很多的2D切片组成了一个扫描或身体的特定部分。 那么如何为这类数据构建深度学习解决方案呢?本文中将介绍6种神经网络架构&#xff0c;可以使用它…

数据结构:各种结构函数参数辨析

&#xff08;一&#xff09;顺序表 1&#xff09;结构 typedef int SLDateType;typedef struct SeqList {SLDateType* data;int size;int capacity; }SeqList;SeqList ps { 0 }; 2&#xff09;函数参数 // 对数据的管理:增删查改 void SeqListInit(SeqList* ps); void Seq…

webpack基础知识六:说说webpack的热更新是如何做到的?原理是什么?

一、是什么 HMR全称 Hot Module Replacement&#xff0c;可以理解为模块热替换&#xff0c;指在应用程序运行过程中&#xff0c;替换、添加、删除模块&#xff0c;而无需重新刷新整个应用 例如&#xff0c;我们在应用运行过程中修改了某个模块&#xff0c;通过自动刷新会导致…

Android Glide MemorySizeCalculator计算值,Kotlin

Android Glide MemorySizeCalculator计算值,Kotlin for (i in 100..1000 step 50) {val calculator MemorySizeCalculator.Builder(this).setMemoryCacheScreens(i.toFloat()).setBitmapPoolScreens(i.toFloat()).setMaxSizeMultiplier(0.8f).setLowMemoryMaxSizeMultiplier(0…

小程序wx:else提示 Bad attr `wx

问题&#xff1a;以下wx:for里的wx:if &#xff0c; wx:else 会报这个错&#xff1a;Bad attr wx <scroll-view class"scroll1" scroll-x enable-flex"true"><view wx:if"{{playlist.length>0}}" class"item" wx:for"…

C++入门--string类的实现

目录 1.string类常用函数实现&#xff08;1&#xff09;string类成员变量定义&#xff08;2&#xff09; string类默认构造函数实现&#xff08;3&#xff09; string类拷贝构造函数实现&#xff08;4&#xff09;string类析构函数&#xff08;5&#xff09;string类c_str()函数…

redis的配置和使用、redis的数据结构以及缓存遇见的常见问题

目录 1.缓存 2.redis不仅仅可以做缓存&#xff0c;只不过说他的大部分场景&#xff0c;是做缓存。本地缓存重启后缓存里的东西就没有了&#xff0c;但是redis有。 3.redis有几个特性:查询快&#xff0c;但是是放到内存里的〈断电或者重启&#xff0c;数据就丢了)&#xff0c…