微信小程序中的节流与防抖 throttle & debounce

节流和防抖是JavaScript性能优化中常见的策略。节流限制函数在特定时间内的执行频率,常用于处理事件如滚动、窗口大小改变等。防抖则确保在连续操作后只执行最后一次,适合搜索框实时查询等场景。实现上,节流通过设定时间间隔确保间隔开始或结束时执行,而防抖则在最后的操作后等待一段时间再执行。
何谓节流和防抖?
  • 节流
    节流的意思是,规定时间内,只触发一次。比如我们设定500ms,在这个时间内,无论点击按钮多少次,它都只会触发一次。具体场景可以是抢购时候,由于有无数人 快速点击按钮,如果每次点击都发送请求,就会给服务器造成巨大的压力,但是我们进行节流后,就会大大减少请求的次数。

  • 防抖
    防抖的意思是,在连续的操作中,无论进行了多长时间,只有某一次的操作后在指定的时间内没有再操作,这一次才被判定有效。具体场景可以搜索框输入关键字过程中实时 请求服务器匹配搜索结果,如果不进行处理,那么就是输入框内容一直变化,导致一直发送请求。如果进行防抖处理,结果就是当我们输入内容完成后,一定时间(比如500ms)没有再 输入内容,这时再触发请求。

结合以上两种情况,回到我们最实际的场景,比如防止表单提交按钮被多次触发,我们应该选择使用节流而不是防抖方案。

节流

throttle(func, wait = 500, immediate = true)

规定时间内,只触发一次,可以通过设置immediate来决定触发的时机在这个时间的开始,还是结束的时候执行。

  • func <Function> 触发回调执行的函数
  • wait <Number> 时间间隔,单位ms
  • immediate <Boolean> 在开始还是结束处触发,比如设置wait为1000ms,如果在一秒内进行了5次操作,只触发一次,如果immediatetrue,那么就会在第一次操作 触发回调,如果为false,就会在第5次操作触发回调。
    let timer; let
        flag
    /**
     * 节流原理:在一定时间内,只能触发一次
     *
     * @param {Function} func 要执行的回调函数
     * @param {Number} wait 延时的时间
     * @param {Boolean} immediate 是否立即执行
     * @return null
     */
    function throttle(func, wait = 500, 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)
        }
    }
    export default throttle
    

    防抖

  • debounce(func, wait = 500, immediate = false)

    在连续的操作中,无论进行了多长时间,只有某一次的操作后在指定的时间内没有再操作,这一次才被判定有效

  • func <Function> 触发回调执行的函数
  • wait <Number> 时间间隔,单位ms
  • immediate <Number> 在开始还是结束处触发,如非特殊情况,一般默认为false即可
let timeout = null

/**
 * 防抖原理:一定时间内,只有最后一次操作,再过wait毫秒后才执行函数
 *
 * @param {Function} func 要执行的回调函数
 * @param {Number} wait 延时的时间
 * @param {Boolean} immediate 是否立即执行
 * @return null
 */
function debounce(func, wait = 500, immediate = false) {
    // 清除定时器
    if (timeout !== null) clearTimeout(timeout)
    // 立即执行,此类情况一般用不到
    if (immediate) {
        const callNow = !timeout
        timeout = setTimeout(() => {
            timeout = null
        }, wait)
        if (callNow) typeof func === 'function' && func()
    } else {
        // 设置定时器,当最后一次操作后,timeout不会再被清除,所以在延时wait毫秒后执行func回调方法
        timeout = setTimeout(() => {
            typeof func === 'function' && func()
        }, wait)
    }
}

export default debounce

微信小程序中,通常将防抖节流函数封装在公用的 JS 文件里。以下是封装的具体代码及解释: ```javascript // common.js /* 函数节流 */ function throttle(fn, interval) { var enterTime = 0; // 触发的时间 var gapTime = interval || 300; // 间隔时间,如果 interval 不传值,默认为 300ms return function() { var that = this; var backTime = new Date(); // 第一次函数 return 即触发的时间 if (backTime - enterTime &gt; gapTime) { fn.call(that, arguments); enterTime = backTime; // 赋值给第一次触发的时间,保存第二次触发时间 } }; } /* 函数防抖 */ function debounce(fn, interval) { var timer; var gapTime = interval || 1000; // 间隔时间,不传值默认为 1000ms return function() { clearTimeout(timer); var that = this; var args = arguments; // 保存 arguments,setTimeout 是全局的,arguments 不是防抖函数需要的 timer = setTimeout(function() { fn.call(that, args); }, gapTime); }; } /* 导出 */ export default { throttle, debounce }; ``` 上述代码中,`throttle` 函数实现了节流功能,它会限制函数的调用频率,确保在一定时间间隔内函数只执行一次。`debounce` 函数实现了防抖功能,它会在一定时间内如果没有再次触发事件,才会执行函数,如果在这段时间内再次触发了事件,则会重新计时。 使用方法如下: ```javascript // 导入 import tool from &#39;路径&#39;; Page({ data: { a: 0 }, // 默认时间(1 秒) onPageScroll: tool.throttle(function(a) { console.log(a); }), // 自定义时间 goUnlock: tool.debounce(function() { // ... }, 3000) }); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值