防抖节流实践及vue中使用

Posted 耶稣与梦

tags:

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

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

最近发现在网络慢情况,或并发高情况下,未使用防抖节流导致出现一定性能问题


一、防抖节流理解

防抖:在一段时间内连续点击触发方法,每次触发会重新计时,最常用场景:在文本框输入值立马去后台查询数据,频繁调用后台造成性能问题,可以使用防抖,在一定时间内只去后台查询一次。( echart图表监听窗口改变重新渲染、滚动事件、滑动事件)

节流:在一段时间内连续点击触发方法,在这段时间内只执行一次,不会去重新计时,最常用场景:去请求接口数据。或者更新数据,可以使用节流,保证在(假设一秒内)只执行一次查询,或者更新操作

二、代码示例

1.演示地址

点我查看

2.vue中使用防抖节流

代码如下(示例):

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="viewport-fit=cover,width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
    <title></title>

</head>

<body>
<div id="main">
    <button @click="click1">不使用防抖(count1)</button>
    <button @click="click2">使用防抖(count2)</button>
    <button  @click="click3">不使用节流(count3)</button>
    <button  @click="click4">使用节流(count4)</button>
</div>
</body>
<script src="http://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
<script>
	//节流
    throttle = function (f, t, im )
        if(!t) t = 1000;
        var flag = true;
        im = typeof(im) == "undefined" ? true : im
        return  function ()
            if(flag)
                flag = false
                im && f.apply(this,arguments)
                setTimeout(() => 
                    !im && f.apply(this,arguments)
                    flag = true
                ,t)
            
        
    
    //防抖 一般用于input实时查询后台接口 isLoad=true 是否立即执行一次
    debounce = function(func,wait,immediate) 
        var timeout;
        wait = wait||1000
        immediate = typeof(immediate) == "undefined" ? true : immediate
        return function () 
            var context = this;
            var args = arguments;
            // 防抖函数的代码使用这两行代码来获取 this 和 参数,是为了让 debounce 函数最终返回的函数 this 指向不变以及依旧能接受到 e 参数。
            if (timeout) clearTimeout(timeout);
            if (immediate)  // 立即执行
                var callNow = !timeout;
                timeout = setTimeout(() => 
                    timeout = null;
                , wait)
                if (callNow) func.apply(context, args)
            
            else  // 非立即执行
                timeout = setTimeout(function()
                    func.apply(context, args)
                , wait);
            
        
    
    new Vue(
        el:'#main',
        data()
            return 
                count1:0, count2:0, count3:0, count4:0
            
        ,
        methods:
            click1()
                console.log("不使用防抖=>",new Date().getTime())
                this.count1 ++;
            ,
            click2:debounce(function()
                console.log("使用防抖=>",new Date().getTime())
                this.count2 ++;
            ),
            click3()
                console.log("不使用节流=>",new Date().getTime())
                this.count3 ++;
            ,
            click4:throttle(
                function()
                    console.log("使用节流=>",new Date().getTime())
                    this.count4 ++;
                
            )
        

    )
</script>

</html>

三、总结

防抖节流能够提高性能,在高并发情况下能够减少后台请求访问量

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

防抖节流一步一步详细讲解,从简单到复杂,从入门到深入了解,再到 Vue 项目中是怎样调用防抖节流方法的

vue中使用防抖节流

记录--Vue 3 中的极致防抖/节流(含常见方式防抖/节流)

关于闭包 vue3 防抖 节流

记录--Vue 3 中的极致防抖/节流(含常见方式防抖/节流)

Vue 3 中的极致防抖/节流(含常见方式防抖/节流)