当前位置: 首页 > article >正文

【前端】vue 防抖和节流

在 Vue.js 中,防抖(Debounce)节流(Throttle) 是优化高频事件(如输入、滚动、点击)的核心技术,可显著提升性能与用户体验。以下是具体实现方法和最佳实践:


⏳ 一、防抖(Debounce)

定义:事件触发后延迟执行函数,若在延迟时间内再次触发,则重新计时(只执行最后一次)。
适用场景:搜索框输入联想、窗口大小调整。

实现方式:
  1. 手动实现

    function debounce(func, delay = 300) {let timeout;return function(...args) {clearTimeout(timeout);timeout = setTimeout(() => func.apply(this, args), delay);};
    }
    
  2. 在 Vue 组件中使用

    methods: {handleInput: debounce(function(event) {console.log('搜索关键词:', event.target.value); // 实际调用 API 或处理逻辑}, 500) // 延迟 500ms
    }
    
    <template><input @input="handleInput" placeholder="输入关键词搜索" />
    </template>
    

⚡ 二、节流(Throttle)

定义:在指定时间间隔内,无论事件触发多少次,函数只执行一次
适用场景:滚动加载更多、按钮防重复点击。

实现方式:
  1. 手动实现

    function throttle(func, limit = 1000) {let inThrottle;return function(...args) {if (!inThrottle) {func.apply(this, args);inThrottle = true;setTimeout(() => inThrottle = false, limit);}};
    }
    
  2. 在 Vue 组件中使用

    methods: {handleClick: throttle(function() {console.log('提交订单时间:', new Date()); // 实际提交逻辑}, 2000) // 2 秒内只执行一次
    }
    
    <template><button @click="handleClick">提交订单</button>
    </template>
    

🔧 三、进阶实现方案

1. 使用第三方库(推荐)
  • 安装 Lodash:
    npm install lodash
    
  • 在组件中调用:
    import { debounce, throttle } from 'lodash';export default {methods: {search: debounce(() => { /* API 调用 */ }, 300),scrollHandler: throttle(() => { /* 滚动加载逻辑 */ }, 200)}
    };
    
2. 自定义全局指令

适用于按钮节流等复用场景:

// main.js
Vue.directive('throttle-click', {inserted(el, binding) {let lastTime = 0;el.addEventListener('click', () => {const now = Date.now();if (now - lastTime >= (binding.arg || 1000)) {binding.value(); // 执行绑定函数lastTime = now;}});}
});
<template><button v-throttle-click:2000="submit">防重复提交</button>
</template>

📊 四、防抖 vs 节流:核心区别与场景对比

特性防抖(Debounce)节流(Throttle)
执行时机事件停止触发后执行固定时间间隔执行一次
适用场景搜索联想、输入验证滚动加载、按钮防重
用户感知响应延迟,但减少无效请求即时响应但限制频率

🛠️ 五、最佳实践

  1. 优先使用 Lodash:避免重复造轮子,其实现经过严格测试。
  2. 组件销毁时清理定时器:在 beforeDestroy 生命周期中清除未执行函数:
    beforeDestroy() {this.handleScroll.cancel(); // Lodash 节流函数需手动取消
    }
    
  3. 平衡时间间隔
    • 防抖延迟建议 300ms(输入场景);
    • 节流间隔建议 200ms(滚动事件)或 1000ms(按钮点击)。
  4. 避免过度优化:非高频事件无需强制使用,以免增加复杂度。

通过合理应用防抖与节流,可有效解决搜索联想、滚动加载、按钮防重等高频交互的性能问题。根据场景选择合适方案,结合第三方库或自定义指令提升开发效率。

http://www.lryc.cn/news/2401032.html

相关文章:

  • Modbus转EtherNET IP网关开启节能改造新范式
  • Android高级开发第四篇 - JNI性能优化技巧和高级调试方法
  • 【PCB工艺】绘制原理图 + PCB设计大纲:最小核心板STM32F103ZET6
  • C#入门学习笔记 #7(传值/引用/输出/数组/具名/可选参数、扩展方法(this参数))
  • 【DeepSeek】【Dify】:用 Dify 对话流+标题关键词注入,让 RAG 准确率飞跃
  • DELETE 与 TRUNCATE、DROP 的区别
  • yFiles:专业级图可视化终极解决方案
  • VSCode 工作区配置文件通用模板创建脚本
  • echarts显示/隐藏标签的同时,始终显示饼图中间文字
  • 【Spring AI】调用 DeepSeek 实现问答聊天
  • Java消息队列与安全实战:谢飞机的烧饼摊故事
  • parquet :开源的列式存储文件格式
  • SpringBoot关于文件上传超出大小限制--设置了全局异常但是没有正常捕获的情况+捕获后没有正常响应返给前端
  • 【Go语言】Ebiten游戏库开发者文档 (v2.8.8)
  • Spring Boot应用开发实战
  • 实验设计与分析(第6版,Montgomery著,傅珏生译) 第9章三水平和混合水平析因设计与分式析因设计9.5节思考题9.1 R语言解题
  • Pycharm 配置解释器
  • learn react course
  • SQL进阶之旅 Day 11:复杂JOIN查询优化
  • web第八次课后作业--分层解耦
  • MySQL 事务深度解析:面试核心知识点与实战
  • 使用Redis作为缓存,提高MongoDB的读写速度
  • 【图片自动识别改名】识别图片中的文字并批量改名的工具,根据文字对图片批量改名,基于QT和腾讯OCR识别的实现方案
  • Kafka消息队列笔记
  • 机器人变量类型与配置
  • nssm配置springboot项目环境,注册为windows服务
  • 20-项目部署(Docker)
  • Python学习(6) ----- Python2和Python3的区别
  • 零基础安装 Python 教程:从下载到环境配置一步到位(支持 VSCode 和 PyCharm)与常用操作系统操作指南
  • SAP学习笔记 - 开发18 - 前端Fiori开发 应用描述符(manifest.json)的用途