<返回更多

JS问题:项目中如何区分使用防抖或节流?

2023-12-21  今日头条  程序员大澈
加入收藏

序言

大家好,我是大澈!

本文约2300+字,整篇阅读大约需要6分钟。

本文主要内容分三部分,第一部分是需求分析,第二部分是实现步骤,第三部分是问题详解。

如果您只需要解决问题,请阅读第一、二部分即可。

如果您有更多时间,进一步学习问题相关知识点,请阅读至第三部分。

一、需求分析

当用户多次频繁点击按钮时,只允许请求一次后端接口,避免重复无用请求。

没办法,谁让我们的客户就是会1秒点10次的超能力。

JS问题:项目中如何区分使用防抖或节流?

二、实现步骤

1、选择防抖,还是节流?

对于控制事件触发的频率,我们应该很容易的就会想到JS中的防抖和节流。

防抖(Debounce)和节流(Throttle)是前端开发中最常用的优化处理方式,相信大家也都会使用。

但是如果谈起两者定义的区分,以及两者应用场景的不同,就会有朋友吐槽:“我靠,这不都一样嘛!”。

所以,我们到底要怎么选择呢?

2、两者定义的区分

简单的定义区分:

详细的定义区分:

最后,再搭配上“大澈原创”之无敌美丽动人草图:

JS问题:项目中如何区分使用防抖或节流?

就问你,还有谁还区分不明白防抖和节流的定义,还有谁?

3、两者应用场景的区分

真实的项目中,在不同的场景下灵活切换使用防抖或节流,才会更加减少不必要的资源消耗,更加提高前端应用的性能和响应性。

防抖(Debounce)的应用场景:

节流(Throttle)的应用场景:

4、两者的代码实例(了解即可别纠结)

防抖代码实例如下:

// 防抖:点击查询城市接口
var btn1 = document.querySelector("button");
var timer;

btn1.onclick = function () {
//先清空延时器,然后再去调用接口
clearTimeout(timer);
// 每次点击按钮都会清空延时器,然后重新计时,延迟一秒执行函数
timer = setTimeout(city, 3000);
};

function city() {
ajax({
method: "get",
url: "https://geoapi.qweather.com/v2/city/lookup",
data: {
location: "青岛",
key: "759cb11054344aaba4b8791ec40274dd",
},
aysn: true,
contentType: "",
success: function (res) {
var obj = JSON.parse(res);
console.log(obj, "请求成功的数据");
},
});

节流代码实例如下:

// 节流:鼠标移动在控制台打印坐标
// fn(3000, handlePrint)
function fn(delay, behavior) {
var timer = null;
return function (val) {
if (!timer) {
timer = setTimeout(function () {
//调用handlePrint函数
behavior(val);
timer = null;
}, delay);
}
};
}

function handlePrint(val) {
console.log(val, "我是鼠标坐标");
}

//调用fn把1000和handlePrint这个函数传进去
var handle = fn(3000, handlePrint);

document.addEventListener("mousemove", function (e) {
handle(e.offsetX);
});

只是看看原理,差不多了解即可,不要太纠结,项目中肯定不会这么使用,不然会被喷的。

Vue等真实项目中,往往都会调用第三方库的函数,具体内容见第三部分。

三、问题详解

1、常用的防抖节流函数库整理

流行的独立JAVAScript 库:

特定于框架的JavaScript 库:

import { useDebounce, useThrottle } from '@vueuse/core';

// 防抖
// 在值变化后延迟500毫秒触发
const debouncedValue = useDebounce(value, 500); 

// 节流
// 将函数封装为节流函数,每300毫秒触发一次
const throttledFunction = useThrottle(myFunction, 300); 

// 在 Vue 组件中使用防抖和节流
export default {
setup() {
const debouncedValue = useDebounce(value, 500);
const throttledFunction = useThrottle(myFunction, 300);
},
}
关键词:JS      点击(17)
声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多JS相关>>>