当前位置:首页 > 技术 > 正文内容

lodash中的throttle与debounce使用详解

访客 技术 2026年8月2日 1

在前端开发中,节流(throttle)和防抖(debounce)是常用的性能优化手段。lodash库提供了成熟的实现方案,本文详细介绍它们的API、使用场景以及在Vue和React中的集成方式。

1. 节流 (throttle)

_.throttle(func, [wait=0], [options={}])

参数说明:

  • func (Function): 需要限制执行频率的函数
  • [wait=0] (number): 执行间隔的毫秒数
  • [options={}] (Object): 配置选项
  • [options.leading=true] (boolean): 是否在节流开始时立即调用,默认true
  • [options.trailing=true] (boolean): 是否在节流结束后再调用一次,默认true

实例说明:

const handleThrottle = _.throttle(function() {
  console.log("throttle executed");
}, 5000, {
  leading: true,
  trailing: false
});

当按钮绑定handleThrottle时,效果如下:

  • 首次点击立即输出 "throttle executed"
  • 5秒内重复点击只触发一次
  • 5秒后再次点击会重新触发

注意:当trailing为true(默认值)时,节流结束时会额外执行一次,表现为点击后立即执行一次,5秒后再执行一次。

2. 防抖 (debounce)

_.debounce(func, [wait=0], [options={}])

参数说明:

  • func (Function): 需要防抖的函数
  • [wait=0] (number): 延迟执行的毫秒数
  • [options={}] (Object): 配置选项
  • [options.leading=false] (boolean): 是否在延迟开始前立即调用,默认false
  • [options.maxWait] (number): 允许函数被延迟的最大时间
  • [options.trailing=true] (boolean): 是否在延迟结束后调用,默认true

实例说明:

const handleDebounce = _.debounce(function() {
  console.log("debounce executed");
}, 2000, {
  leading: true,
  trailing: false
});

绑定按钮后的表现:

  • 首次点击立即输出 "debounce executed"
  • 连续点击多次只触发一次(以最后一次点击为准)
  • 停止点击后等待2秒不再触发

默认配置下(leading为false,trailing为true),函数会在停止触发后2秒执行。

3. Vue中的集成方式

安装lodash:

# Yarn
$ yarn add lodash
# NPM
$ npm install lodash --save

节流用法:

<template>
  <button @click="throttledMethod">快速点击我</button>
</template>

<script>
import _ from 'lodash'

export default {
  methods: {
    throttledMethod: _.throttle(() => {
      console.log('每2秒最多执行一次')
    }, 2000)
  }
}
</script>

防抖用法:

<template>
  <button @click="debouncedMethod">快速点击我</button>
</template>

<script>
import _ from 'lodash'

export default {
  methods: {
    debouncedMethod: _.debounce(() => {
      console.log('停止点击2秒后执行')
    }, 2000)
  }
}
</script>

4. React中的集成方式

import _ from 'lodash';

class MyComponent extends React.Component {
  // 防抖
  handleClick = _.debounce((e) => {
    console.log('防抖触发,5秒内不重复点击才执行');
  }, 5000, {
    leading: true,
    trailing: false
  });

  // 节流
  handleScroll = _.throttle((e) => {
    console.log('节流触发,5秒内最多执行一次');
  }, 5000, {
    leading: true,
    trailing: false
  });

  render() {
    return (
      <button onClick={this.handleClick}>点击按钮</button>
    );
  }
}

在React中,可以直接在类组件中将lodash的debounce或throttle方法赋值给类方法,但需要注意箭头函数的绑定方式。

标签: lodash

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。