Vue3 + Vite 中使用 Lodash-es 的防抖 debounce 详解

news2025/6/9 7:01:53

Vue3 + Vite 中使用 Lodash-es 的防抖(debounce)详解

在 Vue3 + Vite 项目中,debounce 是 lodash-es 中最常用的功能之一,它可以帮助我们优化高频事件的处理。下面我将详细讲解 debounce 的使用方法,并提供一个完整的示例。

Debounce 核心概念

防抖(debounce) 是一种优化高频操作的技术。它会将多次连续的操作合并为一次,确保函数在指定时间间隔内只执行一次。

适用场景

  • 搜索框输入建议

  • 窗口大小调整事件

  • 滚动事件处理

  • 表单验证

在 Vue3 中使用 Debounce

安装 lodash-es

bash

复制

下载

npm install lodash-es

Debounce 参数详解

基本语法

javascript

复制

下载

const debouncedFunc = debounce(func, [wait=0], [options={}])

参数说明

  • func (Function): 要防抖的函数

  • [wait=0] (number): 延迟的毫秒数

  • [options={}] (Object): 选项对象

  • [options.leading=false] (boolean): 指定在延迟开始前调用

  • [options.trailing=true] (boolean): 指定在延迟结束后调用

  • [options.maxWait] (number): 设置 func 允许被延迟的最大时间

选项说明

  1. leading: true (立即执行模式)

    • 第一次触发时立即执行

    • 后续在等待时间内触发不会执行

    • 等待时间结束后再次触发会再次立即执行

  2. trailing: true (延迟执行模式 - 默认)

    • 第一次触发后开始计时

    • 在等待时间内再次触发会重置计时器

    • 等待时间结束后执行最后一次操作

  3. maxWait (最大等待时间)

    • 确保函数在指定时间内至少执行一次

    • 即使连续触发也不会超过这个时间间隔

在 Vue3 中使用 Debounce 的最佳实践

1. 在 setup 中创建防抖函数

javascript

复制

下载

import { debounce } from 'lodash-es'

// 在 setup 中创建防抖函数
const debouncedFunction = debounce(() => {
  // 你的逻辑
}, 300)

2. 组件卸载时取消防抖

javascript

复制

下载

import { onUnmounted } from 'vue'

onUnmounted(() => {
  debouncedFunction.cancel()
})

3. 在模板中使用

vue

复制

下载

<input @input="debouncedSearch" />

4. 处理带参数的函数

javascript

复制

下载

const debouncedSearch = debounce((searchTerm) => {
  // 使用 searchTerm
}, 500)

// 在事件处理中
const handleInput = (e) => {
  debouncedSearch(e.target.value)
}

5. 使用立即执行模式(leading)

javascript

复制

下载

const handleClick = debounce(() => {
  // 处理点击
}, 1000, { leading: true, trailing: false })

注意事项

  1. 避免重复创建:不要在每次渲染时创建新的 debounce 函数,否则会失去防抖效果

  2. 组件卸载时取消:防止内存泄漏和意外执行

  3. 合理设置等待时间

    • 搜索建议:200-500ms

    • 窗口调整:100-300ms

    • 按钮点击:1000ms(防止重复提交)

  4. 与 async/await 一起使用

    javascript

    复制

    下载

    const debouncedAsync = debounce(async (param) => {
      const result = await fetchData(param)
      // 处理结果
    }, 300)

这个示例展示了在 Vue3 + Vite 项目中如何有效地使用 lodash-es 的 debounce 功能,涵盖了多种使用场景和配置选项。

<template>
  <div class="container">
    <h1>Lodash-es Debounce 使用演示</h1>
    
    <div class="input-group">
      <label>搜索输入 (500ms 防抖):</label>
      <input 
        type="text" 
        v-model="searchTerm" 
        @input="handleSearchInput"
        placeholder="输入搜索关键词..."
      />
      <div class="search-result">搜索结果: {{ searchResults }}</div>
    </div>
    
    <div class="resize-group">
      <div class="resize-box" :style="{ width: boxWidth + 'px' }">
        调整窗口大小查看效果
      </div>
      <p>窗口大小: {{ windowSize.width }} x {{ windowSize.height }}</p>
    </div>
    
    <div class="button-group">
      <button @click="handleButtonClick">快速点击我 (防抖处理)</button>
      <p>点击次数: {{ clickCount }}</p>
    </div>
  </div>
</template>

<script setup>
import { ref, onMounted, onUnmounted } from 'vue'
import { debounce } from 'lodash-es'

// 搜索相关状态
const searchTerm = ref('')
const searchResults = ref('')

// 防抖处理搜索输入
const handleSearchInput = debounce(() => {
  searchResults.value = `正在搜索: "${searchTerm.value}"...`
  console.log('执行搜索:', searchTerm.value)
}, 500)

// 窗口大小相关状态
const windowSize = ref({ width: window.innerWidth, height: window.innerHeight })

// 防抖处理窗口大小变化
const handleResize = debounce(() => {
  windowSize.value = {
    width: window.innerWidth,
    height: window.innerHeight
  }
  console.log('窗口大小更新:', windowSize.value)
}, 300)

// 监听窗口大小变化
onMounted(() => {
  window.addEventListener('resize', handleResize)
})

// 组件卸载时移除监听器
onUnmounted(() => {
  window.removeEventListener('resize', handleResize)
})

// 按钮点击相关状态
const clickCount = ref(0)

// 防抖处理按钮点击(带立即执行选项)
const handleButtonClick = debounce(() => {
  clickCount.value += 1
  console.log('按钮点击处理', clickCount.value)
}, 1000, { leading: true, trailing: false })
</script>

<style>
.container {
  max-width: 800px;
  margin: 0 auto;
  padding: 2rem;
  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
  background: linear-gradient(135deg, #f5f7fa, #e4edf9);
  min-height: 100vh;
  border-radius: 12px;
  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
}

h1 {
  color: #2c3e50;
  text-align: center;
  margin-bottom: 2rem;
  border-bottom: 2px solid #3498db;
  padding-bottom: 1rem;
}

.input-group, .resize-group, .button-group {
  background: white;
  padding: 1.5rem;
  border-radius: 10px;
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
  margin-bottom: 2rem;
}

label {
  display: block;
  margin-bottom: 0.5rem;
  font-weight: 600;
  color: #34495e;
}

input {
  width: 100%;
  padding: 0.8rem;
  border: 1px solid #ddd;
  border-radius: 6px;
  font-size: 1rem;
  margin-bottom: 1rem;
  transition: border 0.3s;
}

input:focus {
  border-color: #3498db;
  outline: none;
  box-shadow: 0 0 0 2px rgba(52, 152, 219, 0.2);
}

.search-result {
  padding: 1rem;
  background-color: #e3f2fd;
  border-radius: 6px;
  font-weight: 500;
  color: #2c3e50;
}

.resize-box {
  height: 150px;
  background: linear-gradient(45deg, #3498db, #9b59b6);
  color: white;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1.2rem;
  font-weight: bold;
  border-radius: 8px;
  margin-bottom: 1rem;
  transition: width 0.3s ease;
}

p {
  color: #7f8c8d;
  font-size: 0.95rem;
}

button {
  background: #3498db;
  color: white;
  border: none;
  padding: 0.8rem 1.5rem;
  border-radius: 6px;
  font-size: 1rem;
  font-weight: 600;
  cursor: pointer;
  transition: background 0.3s, transform 0.2s;
  display: block;
  width: 100%;
  max-width: 300px;
  margin: 0 auto;
}

button:hover {
  background: #2980b9;
}

button:active {
  transform: translateY(2px);
}

.button-group p {
  text-align: center;
  margin-top: 1rem;
  font-size: 1.1rem;
  font-weight: bold;
  color: #2c3e50;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2405083.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习基础相关问题

机器学习相关的基础问题 K-means是否一定会收敛 K-means是否一定会收敛 K-means算法在有限步数内一定会收敛&#xff0c;但收敛到的可能是局部最优解而非全局最优解。以下是详细分析&#xff1a; K-means 的优化目标是最小化 样本到其所归属簇中心的距离平方和&#xff08;SSE…

验证负载均衡与弹性伸缩

什么是弹性伸缩&#xff08;Auto Scaling&#xff09;&#xff1f; 弹性伸缩是指 云计算平台根据实时负载自动调整计算资源&#xff08;如服务器实例、容器Pod&#xff09;数量&#xff0c;以确保系统在高峰时保持稳定&#xff0c;在低谷时节省成本。 什么时候会触发弹性伸缩&…

Three.js中AR实现详解并详细介绍基于图像标记模式AR生成的详细步骤

文档地址 Three.js中AR实现详解 以下是Three.js中实现AR功能的详细解析&#xff0c;涵盖技术原理、实现步骤、核心组件及优化策略&#xff1a; &#x1f9e9; 一、技术基础 AR.js框架的核心作用 AR.js是Three.js实现AR的基石&#xff0c;提供以下核心能力&#xff1a; 多模…

GeoBoundaries下载行政区划边界数据(提供中国资源shapefile)

要下载山东省济南市各个区的行政区划边界数据&#xff0c;你可以通过 geoBoundaries 提供的数据来实现。下面是详细步骤&#xff0c;包括网页操作和可选的 Python 自动化方式。 目录 ✅ 一、通过 geoBoundaries 官网手动下载1. 打开官网&#xff1a;2. 查找中国数据&#xff1a…

大模型如何选型?嵌入模型如何选型?

欢迎来到啾啾的博客&#x1f431;。 记录学习点滴。分享工作思考和实用技巧&#xff0c;偶尔也分享一些杂谈&#x1f4ac;。 有很多很多不足的地方&#xff0c;欢迎评论交流&#xff0c;感谢您的阅读和评论&#x1f604;。 目录 引言模型优劣认知与模型选择大模型&#xff08;L…

开源大模型网关:One API实现主流AI模型API的统一管理与分发

以下是对One API的简单介绍&#xff1a; One API是一个使用go语言开发的大语言模型 API 管理与分发系统支持Docker一键快速部署&#xff0c;且资源占用小&#xff0c;高性能开箱支持多平台大模型快速接入&#xff0c;包括OpenAI、Gemini、xAI、Grop、Anthropic Claude、Ollama…

智慧充电:新能源汽车智慧充电桩的发展前景受哪些因素影响?

全球能源结构转型与碳中和目标的推进&#xff0c;新能源汽车产业迎来爆发式增长&#xff0c;而智慧充电桩作为其核心基础设施&#xff0c;发展前景备受关注。智慧充电不仅关乎用户充电体验的优化&#xff0c;更是电网平衡、能源效率提升的关键环节。 然而&#xff0c;其发展并…

【网站建设】不同类型网站如何选择服务器?建站项目实战总结

做了几个建站项目后,深刻体会到一件事:不同类型的网站,所采用的服务器策略是完全不同的。 如果选错了服务器方案,可能带来过高的成本、过低的性能,甚至上线失败。 这篇文章分享一下我在实战中的经验,供正在做建站项目的朋友参考。 🚩 1️⃣ 纯展示型网站 —— 静态服务…

iptables实验

实验一&#xff1a;搭建web服务&#xff0c;设置任何人能够通过80端口访问。 1.下载并启用httpd服务器 dnf -y install httpd 开启httpd服务器 systemctl start httpd 查看是否启用 下载并启用iptables&#xff0c;并关闭firewalld yum install iptable…

前后端分离开发 和 前端工程化

来源&#xff1a;黑马程序员JavaWeb开发教程&#xff0c;实现javaweb企业开发全流程&#xff08;涵盖SpringMyBatisSpringMVCSpringBoot等&#xff09;_哔哩哔哩_bilibili 前后端混合开发&#xff1a; 需要使用前端的技术栈开发前端的功能&#xff0c;又需要使用Java的技术栈…

web端rtmp推拉流测试、抽帧识别计数,一键式生成巡检报告

本文旨在实现无人机城市交通智慧巡检中的一个模块——无人机视频实时推拉流以及识别流并在前端展示&#xff0c;同时&#xff0c;统计目标数量以及违停数量&#xff0c;生成结果评估&#xff0c;一并发送到前端展示。对于本文任何技术上的空缺&#xff0c;可在博主主页前面博客…

Excel 表格内批量添加前缀与后缀的实用方法

我们经常需要为 Excel 表格中的内容统一添加前缀或后缀&#xff0c;例如给编号加“NO.”、给姓名加“会员_”等。手动操作效率低&#xff0c;本文将介绍几种实用的方法&#xff0c;帮助你快速完成批量添加前缀和后缀的操作。 使用“&”运算符添加前缀或后缀&#xff08;推…

2024 CKA题库+详尽解析| 15、备份还原Etcd

目录 免费获取题库配套 CKA_v1.31_模拟系统 15、 备份还原Etcd 题目&#xff1a; 开始操作: 1&#xff09;、切换集群 2&#xff09;、登录master并提权 3&#xff09;、备份Etcd现有数据 4&#xff09;、验证备份数据快照 5&#xff09;、查看节点和Pod状态 6&am…

西门子 S7-1200 PLC 海外远程运维技术方案

西门子 S7-1200 PLC 海外远程运维技术方案 一、面向海外场景的核心优势 针对跨国企业、海外项目及远程技术支持需求&#xff0c;本方案基于巨控GRM552Y-CHE模块提供无缝的全球化远程PLC运维能力&#xff0c;突破地域及时差限制&#xff0c;显著提升国际项目响应效率。 二、海…

嵌入式学习--江协stm32day5

USART 1. 引脚与接口层 异步引脚&#xff1a; TX&#xff1a;发送数据输出&#xff1b;RX&#xff1a;接收数据输入&#xff1b;SW_RX&#xff1a;单线半双工模式的接收引脚&#xff08;替代 RX&#xff09;。 同步引脚&#xff1a;SCLK&#xff1a;同步模式下的时钟输出&…

(LeetCode 动态规划(基础版))96. 不同的二叉搜索树 (递推 || 递归)

题目&#xff1a;96. 不同的二叉搜索树 思路&#xff1a;二叉树长度为n时&#xff0c;枚举每个点u作为根节点root&#xff0c;那么root左边的数构成左子树种数left&#xff0c;root右边的数构成右子树种数right&#xff0c;那么当前u为根节点下&#xff0c;二叉树的种数为left*…

vue项目使用svg图标

下面是在 Vue 3 项目中完整引入和使用 vite-plugin-svg-icons 的步骤 1、安装插件 npm install vite-plugin-svg-icons -D # 或 yarn add vite-plugin-svg-icons -D # 或 pnpm add vite-plugin-svg-icons -D 2、配置 Vite 在 vite.config.ts 或 vite.config.js 中配置&…

智能网卡之hinic3 WQE(Work Queue Element)结构梳理

hinic3 WQE&#xff08;Work Queue Element&#xff09;结构详解 本文基于 hinic3 驱动源码&#xff0c;对 WQE&#xff08;Work Queue Element&#xff09;做详细讲解。如需查阅完整源码和结构体定义可参考hinic3_nic_qp.h等文件。 1. WQE 的作用 WQE&#xff08;Work Queue…

力扣HOT100之二分查找:4. 寻找两个正序数组的中位数

这道题如果没有时间复杂度的限制的话&#xff0c;相当好做&#xff0c;但是这道题要求时间复杂度为O(log(m n))&#xff0c;思路很难想&#xff0c;我看了一圈题解&#xff0c;发现华南溜达虎的视频讲得还不错&#xff0c;我是参考他的思路写出来的&#xff0c;这里把他的思路…

PyTorch——损失函数与反向传播(8)

Loss Functions 越小越好 L1loss MSELoss 损失函数 CrossEntyopyLoss 损失函数 import torch from torch.nn import L1Loss from torch import nn# 创建输入和目标张量&#xff0c;用于后续的损失计算 inputs torch.tensor([1,2,3],dtypetorch.float32) targets torch.tenso…