前端小白不迷路 - 今天来讲下项目中常见的节流和防抖

128 阅读2分钟

这是我参与8月更文挑战的第29天,活动详情查看:8月更文挑战

前言:

大家好啊,又见面了,我是loncon,一个前端路上不断探索的小白,让我们开始今天的主题:项目中常见的节流和防抖。

事件频繁触发可能造成的问题

1、一些浏览器事件: window.onresize window.mousemove等,触发的频率非常搞,会造成浏览器性能问题, onresize 事件会在窗口或框架被调整大小时发生。
2、如果向后台发送请求,频繁触发,对服务器造成不必要的压力.

如何限制事件处理函数频繁调用

1、函数节流 2、函数防抖

函数节流(throttle)

理解:减少一段时间的触发频率 每间隔一段时间调用一次,比如王者里的英雄技能,1s内只能触发一次,手速再快,也是一样的时间 场景: 轮播图按钮,一直点但是就是按照它的时间来

var input = document.querySelector('input')
var flag = true
input.oninput = function(){
    if(flag){
        flag = false
    }
    console.log(input.value)
    setTimeout(function(){
        flag = true
    },1000)
}

函数防抖(debounce)

理解:

一改就发送Ajax请求,发送的请求太多了,需要做防抖处理

函数防抖:

当持续触发事件时,只有一定时间段内没有再触发事件,事件处理函数才会执行一次

如果设定的时间到来之前,又一次触发了事件,就重新开始延时

特征:不会立刻执行,先等等看,在一定时间内没有再次触发,才执行
举例: 英雄回城被打断,需要重新等待。

最基本的写法

var input = document.querySelector('input')
var timeId
input.oninput = function(){
    clearTimeout(timeId)
    setTimeout(function(){
        console.log(this.value)
    },1000)
}

项目优化防抖:

getSuggestion(){
    //调用方法,发送请求,对发送的请求进行防抖处理(延迟执行)
    clearTimeout(this.timeId)
    this.timeId = setTimeout(async () =>{
        //检查当前关键字是否为空
        if(this.keyword === ''){
            this.suggestion = []
            return 
        }
        const res = await reqGetSuggestion(this.keyword)
        this.suggestion = res.data.data.options
    },1000)
}

通过setTimeout的方式,在一定的时间间隔内,将多次触发变成一次触发