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

何谓节流和防抖?
  • 节流
    节流的意思是,规定时间内,只触发一次。比如我们设定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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
微信小程序throttle节流)是指限制一个函数在一定的时间间隔内执行的次数。 在实际开发,当我们针对某个事件绑定了一个处理函数时,可能会出现用户频繁触发该事件导致处理函数被频繁调用的情况。这样会给页面性能带来负担,并且操作体验也不够流畅。为了解决这个问题,就可以使用throttle。 通过throttle,我们可以设置一个固定的时间间隔,比如200ms,然后在这个时间间隔内只执行一次该事件的处理函数。当用户触发该事件时,如果距离上一次执行的时间已经超过了设定的时间间隔,那么就立即执行该函数;如果距离上次执行的时间未超过设定的时间间隔,则忽略该次触发。 使用throttle可以有效地控制函数的调用频率,避免因为用户的频繁操作导致性能下降和用户体验下降的问题。 在微信小程序,我们可以通过下面的方式来使用throttle: 1. 首先,引入lodash库的throttle方法,这个方法是用来实现节流的。 ```javascript const _ = require('lodash'); ``` 2. 然后,在需要节流的事件处理函数使用throttle方法进行包装。例如,以下是一个处理按钮点击事件的节流函数: ```javascript Page({ // 点击按钮事件处理函数 handleClick: _.throttle(function() { // 执行操作... }, 200) // 控制在200ms内只能触发一次 }); ``` 通过以上方式,我们就可以在微信小程序实现throttle节流)功能,从而提升页面性能和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值