文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-11-30 03:51

关注

序言

大家好,我是大澈!

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

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

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

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

一、需求分析

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

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

二、实现步骤

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

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

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

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

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

2、两者定义的区分

简单的定义区分:

详细的定义区分:

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

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

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);
},
}
来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯