节流防抖学习与实践

Posted gitbylegend

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了节流防抖学习与实践相关的知识,希望对你有一定的参考价值。

先看看概念

函数防抖(debounce):

在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时;典型的案例就是输入搜索:输入结束后n秒才进行搜索请求,n秒内又输入的内容,就重新计时。像是两个人的对话,A在不停的balabala(持续触发),如果他说话的时候有停顿(一定间隔),但是停顿的时间不够长,就认为A没有说完, 当停顿时间超过一某个范围就认为A说完了,然后B开始回答(响应)。

函数节流(throttle):

规定在一个单位时间内,只能触发一次函数,如果这个单位时间内触发多次函数,只有第一次生效; 典型的案例就是鼠标不断点击触发,规定在n秒内多次点击只有一次生效。感觉像是去排队过安检,当人很多的时候(持续地要进门),安保会隔一段时间放进去几个进行安检(一定时间的间隔)。

场景

前提其实都是某个行为持续地触发,不同之处只要判断是要 优化到减少它的执行次数(throttle) 还是 只执行一次(debounce) 就行。

 

实现(Vue mixin用法)

//防抖
let _d_timer = null;
Vue.prototype.$debounce = (cb, delay) => 
    let that = this;
    if (!delay) 
        delay = 1000;
    
    if (_d_timer) 
        clearTimeout(_d_timer);
    
    _d_timer = setTimeout(function() 
        cb();
        _d_timer = null;
    , delay)



//节流
let throttle_canRun=true;
Vue.prototype.$throttle=(cb,delay)=>
    if(!throttle_canRun)    return;
    if(!delay)    delay=500;
    throttle_canRun=false;
    setTimeout(function()
        throttle_canRun=true;
        cb();
    ,delay)

页面应用

onInput() 
    this.$debounce(()=>
        uni.request(
            url: "https://vipshop.herokuapp.com/api/v1/product/",
            data: 
                name: this.txt
            ,
            success:(res)=> 
                console.log(res)
            
        )
    );
,
throttleHandle()
    this.$throttle(function()
        console.log(111)
    )

 

以上是关于节流防抖学习与实践的主要内容,如果未能解决你的问题,请参考以下文章

闭包与防抖节流

2019 面试准备 - JS 防抖与节流 (超级 重要!!!!!)

防抖与节流区别以及使用场景

js防抖与节流

JavaScript防抖与节流

JavaScript防抖与节流