节流,防抖

64 篇文章 1 订阅
25 篇文章 0 订阅
本文详细介绍了JavaScript中的节流和防抖技术,通过示例代码展示了如何使用throttle.js和debounce.js实现这两个功能。在Vue组件中,以搜索输入框为例,应用了节流技术优化频繁触发的doctorSearch方法,避免过度请求。同时,文章还给出了防抖函数的实现,用于确保在特定时间间隔内只执行最后一次操作。
摘要由CSDN通过智能技术生成

基于wue使用

throttle.js文件

节流

/**
 * 节流
 * @param {function} fn         触发的函数
 * @param {number} interval     间隔时间
 */
export function throttle(fn, interval) {
    var last;
    var timer;
    var interval = interval || 200;
    return function () {
        var th = this;
        var args = arguments;
        var now = +new Date();
        if (last && now - last < interval) {
            clearTimeout(timer);
            timer = setTimeout(function () {
                last = now;
                fn.apply(th, args);
            }, interval);
        } else {
            last = now;
            fn.apply(th, args);
        }
    }
}

vue文件

<template>
  <input type="text" placeholder="搜索医生" class="search-input" 
     @input="doctorSearch($event)"  @keyup.enter="doctorSearch($event)"
 />
</template>
<script>
import { throttle } from "@/utils/throttle";
methods: {
    doctorSearch: throttle(e => {
      let searchVal = e.target.value;
      self.searchVal = searchVal;
      // 全部都重置到第一页
      self.departmentData.map(item => {
        item.page = 1;
      });
      self.onLoad('reload', self.labelActive);
    }, 800),
 }
 </script>

使用方法同上

防抖

/**
 * 防抖
 * @param {function} func       触发的函数
 * @param {number} wait         间隔时间
 * @param {boolean} immediate   是否立即执行
 */
export function debounce(func, wait = 500, immediate = true) {
    let timeout, args, context, timestamp, result

    const later = function () {
        // 据上一次触发时间间隔
        const last = +new Date() - timestamp

        // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
        if (last < wait && last > 0) {
            timeout = setTimeout(later, wait - last)
        } else {
            timeout = null
            // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
            if (!immediate) {
                result = func.apply(context, args)
                if (!timeout) context = args = null
            }
        }
    }

    return function (...args) {
        context = this
        timestamp = +new Date()
        const callNow = immediate && !timeout
        // 如果延时不存在,重新设定延时
        if (!timeout) timeout = setTimeout(later, wait)
        if (callNow) {
            result = func.apply(context, args)
            context = args = null
        }

        return result
    } 
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小四是个处女座

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值