首页 > 其他 > 详细

vue如何实现防抖、节流

时间:2021-05-10 10:35:43      阅读:14      评论:0      收藏:0      [点我收藏+]

防抖
    使用场景:如搜索框,用户在输入的时候使用change事件去调用搜索,如果用户每一次输入都去搜索的话,就会消耗很大的服务器资源。如果每次用户停止输入后,延迟超过一定时间时,才去请求服务器的话,会节省服务器资源,提升用户体验。

    原理:事件回调函数在一段时间(300毫秒)后才执行,如果在这段时间内再次调用则重新从0开始计算到300毫秒的时间,当预定的时间内没有再次调用该函数,则执行事件回调函数

    代码示例:

/**
 * 防抖
 * @param {Function} func 要执行的回调函数 
 * @param {Number} wait 延时的时间
 * @param {Boolean} immediate 是否立即执行 
 * @return null  
 */
let timeout;
export function Debounce(func, wait=300, immediate = false) {
   // 清除定时器
    if (timeout !== null) clearTimeout(timeout);
    // 立即执行,此类情况一般用不到
    if (immediate) {
        var callNow = !timeout;
        timeout = setTimeout(function() {
            timeout = null;
        }, wait);
        if (callNow) typeof func === ‘function‘ && func();
    } else {
        // 设置定时器,当最后一次操作后,timeout不会再被清除,所以在延时wait毫秒后执行func回调方法
        timeout = setTimeout(function() {
            typeof func === ‘function‘ && func();
        }, wait);
    }
}

在vue封装并在main.js注册全局,页面调用如下:

<template>
<el-input style="width:160px;" placeholder="请输入内容" @input="setValueNull" v-model="query.name"  clearable @clear="setValueNull"></el-input>
</template>
<script>
export default {
     methods:{
        //监听用户输入值变化,延迟调用请求函数(getTableListData)
        setValueNull(){
            this.debounce(this.getTableListData)
        }
    }
}
</script>

节流
    使用场景:鼠标不断点击触发,mousedown(单位时间内只触发一次)

    原理:单位时间内连续触发,但是只会执行一次,比如事件在300秒内不断触发点击事件,那么只会执行一次,到下一个300s开始计时的时候,就会在下一个300s内再执行一次;也就是说600s连续触发事件但是只会执行2次。

    代码示例:

/**
 * 节流
 * @param {Function} func 要执行的回调函数 
 * @param {Number} wait 延时的时间
 * @param {Boolean} immediate 是否立即执行
 * @return null
 */
let timer, flag;
export function throttle(func, wait = 300, immediate = true) {
    if (immediate) {
        if (!flag) {
            flag = true;
            // 如果是立即执行,则在wait毫秒内开始时执行
            typeof func === ‘function‘ && func();
            timer = setTimeout(() => {
                flag = false;
            }, wait);
        }
    } else {
        if (!flag) {
            flag = true
            // 如果是非立即执行,则在wait毫秒内的结束处执行
            timer = setTimeout(() => {
                flag = false
                typeof func === ‘function‘ && func();
            }, wait);
        }
        
    }
};

结语
    他们的区别在于,使用时间戳实现的节流函数会在第一次触发事件时立即执行,以后每过 wait 秒之后才执行一次,并且最后一次触发事件不会被执行;而定时器实现的节流函数在第一次触发时不会执行,而是在 wait秒之后才执行,当最后一次停止触发后,还会再执行一次函数。

    希望对大家学习有帮助,能力有限,如果有错误的欢迎指出,共同进步。

vue如何实现防抖、节流

原文:https://www.cnblogs.com/zz009527/p/14749608.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!