防抖和节流的例子解释

防抖和节流的例子

防抖:触发事件在n秒内只执行一次,若在n秒内再次触发,则重新计算时间

如:在点击按钮之后,经过2秒钟时按钮会触发事件,如果在1.5秒时再次点击按钮,则需要重新计算2秒事件才会触发。

节流:连续发生的事件在n秒内只执行一次

也就是说在规定时间内,不管操作多少次,函数只会执行一次。
首先定义div标签用于显示页面操作
<div id="content" style="height: 150px;line-height: 150px;text-align: center;background-color: aqua;"></div>
定义全局变量
	let number=0;
    let content = document.getElementById('content');
    function sum(){
      content.innerHTML = number++;
    }
防抖方案一:事件响应两秒之后执行
//防抖debounce
    //事件响应2秒后执行
    function debounce(fun, waittime) {
      let timeout;//设置定时器
      return function(){
        if(timeout)//如果存在定时器则清空
          clearTimeout(timeout);
       //如果没有定时器则执行下面函数
        timeout = setTimeout(function () {
          fun.apply(this);//函数调用
        },waittime)
      }
    }
防抖方案二:事件立即响应,两秒之后才能再一次操作
//事件立即响应,2秒之后才能重新点击响应
    function debounce(fun,waittime){
      let timeout;//设置定时器
      return function(){
        if(timeout)//如果存在定时器则清空
          clearTimeout(timeout);
        //类型转换
        let timenow = !timeout;

        //规定时间之后重新响应
        timeout = setTimeout(()=>{
          timeout = null;
        },waittime);

        //没有定时器时,timenow为true,执行函数
        if(timenow)
          fun.apply(this);
      }
    }

函数调用

content.onmousemove=debounce(sum, 2000);
节流方案一:设置定时器
// 节流 throttle
    // 设置定时器的方法
    function throttle(fun,waittime){
      let timeout;//设置定时器
      return function () {
        // 如果没有定时器,则执行下面函数
        if(!timeout){
          timeout = setTimeout(()=>{
            timeout=null;
            fun.apply(this);
          },waittime)
        }
      }
    }
节流方案二:定义时间戳
 //时间戳方法
    //通过时间之差判断函数是否执行
    function throttle(fun,waittime) {
      let prev=0;
      return function() {
        let now = Date.now();
        if(now-prev>waittime){
          fun.apply(this);
          prev=now;
        }
      }
    }
节流的方案主要是满足在规定时间内即使多次操作,函数也只会执行一次

函数调用

content.onmousemove=throttle(sum,2000);
参考学习,总结分享,侵权可删
<think>首先,用户的问题是:“我想查找在Vue 3中封装防抖节流的方法 请问Vue 3中封装防抖节流的实现方法”。我需要基于提供的引用系统指令来回答。 系统指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如:[^1] - 回答结构清晰,帮助用户逐步解决问题,尽量保证回答真实可靠。 用户提供的引用: - [^1]: Vue项目中使用防抖节流,封装了防抖节流函数。 - [^2]: vue封装防抖节流,在组件中使用AntiShake.js。 - [^3]: VUE3+TS封装防抖节流函数,包括debounce.ts使用示例。 用户的需求是查找在Vue 3中封装防抖节流的方法。引用[^3]直接指向Vue 3 + TypeScript的封装方法,所以这应该是最相关的。 步骤: 1. **理解防抖节流的概念**:防抖(debounce)是延迟执行函数,直到事件停止触发一段时间;节流(throttle)是限制函数的执行频率,确保在给定时间间隔内只执行一次。 2. **封装方法**:基于引用[^3],我可以提取防抖节流的函数封装。 3. **在Vue 3中使用**:引用[^2][^3]提供了在Vue组件中使用这些封装函数的例子。 4. **结构清晰的回答**:我需要逐步解释封装方法,然后提供在Vue 3中使用的步骤。 5. **生成相关问题**:在回答末尾添加相关问题。 6. **引用格式**:在回答中引用来源时,添加[^1], [^2], [^3]等标识。 回答结构: 1. **介绍防抖节流**:简要解释概念。 2. **封装防抖节流函数**:提供函数代码,基于引用[^3]。 3. **在Vue 3中使用**:展示如何在组件中导入使用这些函数,结合引用[^2][^3]。 4. **完整示例**:给出一个简单的Vue 3组件示例。 5. **注意事项**:如在Vue 3中使用refonMounted等。 6. **相关问题**:生成几个相关问题。 确保使用中文,并在涉及数学表达式时使用LaTeX格式。尽管当前问题不涉及数学,但如果有相关解释,需要遵守。 从引用中提取代码: - 防抖函数封装(来自[^1][^3]): ```typescript export function debounce(func: () => void, delay: number) { let timer: number; return function (this: any, ...args: any[]) { clearTimeout(timer); timer = window.setTimeout(() => { func.apply(this, args); }, delay); }; } ``` - 节流函数封装(来自[^1]): ```typescript export function throttle(func: Function, delay: number) { let timer: number | null = null; return function (this: any, ...args: any[]) { if (!timer) { timer = window.setTimeout(() => { func.apply(this, args); timer = null; }, delay); } }; } ``` 在Vue 3中使用: - 在setup中使用,如同引用[^3]所示。 - 或者在methods中使用,如同引用[^2]所示(但引用[^2]是针对Vue 2的,需要调整)。 引用[^2]是Vue的,但标题是“vue封装防抖节流”,可能不是Vue 3特有。引用[^3]明确指出VUE3+TS,所以优先使用它。 生成相关问题: - 基于主题,生成2-3个相关问题。 最终回答大纲: 1. 什么是防抖节流?简要解释。 2. 封装防抖节流函数:提供代码片段。 3. 在Vue 3中使用:步骤说明示例。 4. 注意事项:如使用TypeScript、清除定时器等。 5. 相关问题。 </think>### Vue 3中封装防抖节流的方法 在Vue 3中,防抖(debounce)节流(throttle)是优化高频事件的常用技术。防抖确保函数在事件停止触发后延迟执行,适用于输入框搜索;节流限制函数在固定时间间隔内只执行一次,适用于滚动事件。以下是基于Vue 3的封装方法,结合组件化特性实现高效集成。 #### 1. **封装防抖节流函数** 首先,创建独立的工具文件(如 `utils/debounce.ts` `utils/throttle.ts`),导出可复用的函数。代码基于引用[^3]优化,支持TypeScript: ```typescript // debounce.ts - 防抖函数封装 export function debounce<T extends (...args: any[]) => void>(func: T, delay: number): (...args: Parameters<T>) => void { let timer: number | null = null; return function (this: any, ...args: Parameters<T>) { if (timer) clearTimeout(timer); timer = window.setTimeout(() => { func.apply(this, args); timer = null; }, delay); }; } // throttle.ts - 节流函数封装 export function throttle<T extends (...args: any[]) => void>(func: T, delay: number): (...args: Parameters<T>) => void { let timer: number | null = null; return function (this: any, ...args: Parameters<T>) { if (!timer) { timer = window.setTimeout(() => { func.apply(this, args); timer = null; }, delay); } }; } ``` - **关键点**: - 使用泛型 `T` 确保函数签名灵活性。 - `window.setTimeout` 替代原生 `setTimeout`,避免TypeScript类型错误。 - 清除定时器逻辑防止内存泄漏(如 `clearTimeout(timer)`)。 #### 2. **在Vue 3组件中使用** 在Vue 3的Composition API中,通过 `ref` 生命周期钩子集成。以下是完整组件示例: ```vue <template> <button ref="searchButton">搜索</button> <input ref="scrollInput" type="text" placeholder="输入内容" /> </template> <script lang="ts" setup> import { ref, onMounted, onBeforeUnmount } from 'vue'; import { debounce, throttle } from '@/utils/debounce'; // 导入封装函数 // 使用ref绑定DOM元素 const searchButton = ref<HTMLButtonElement | null>(null); const scrollInput = ref<HTMLInputElement | null>(null); // 防抖示例:按钮点击事件 const handleSearch = debounce(() => { console.log('防抖:搜索执行'); }, 1000); // 节流示例:输入框滚动事件 const handleScroll = throttle(() => { console.log('节流:滚动执行'); }, 500); onMounted(() => { // 绑定事件监听器 if (searchButton.value) { searchButton.value.addEventListener('click', handleSearch); } if (scrollInput.value) { scrollInput.value.addEventListener('scroll', handleScroll); } }); onBeforeUnmount(() => { // 组件卸载时移除事件,避免内存泄漏 if (searchButton.value) { searchButton.value.removeEventListener('click', handleSearch); } if (scrollInput.value) { scrollInput.value.removeEventListener('scroll', handleScroll); } }); </script> ``` - **步骤解析**: 1. **导入函数**:从工具文件导入 `debounce` `throttle`。 2. **绑定DOM**:使用 `ref` 获取按钮或输入框的引用。 3. **封装事件**:将目标函数(如 `handleSearch`)包裹在防抖/节流函数中,指定延迟时间(如 `1000ms`)。 4. **生命周期管理**:`onMounted` 绑定事件,`onBeforeUnmount` 清理事件监听器[^3]。 #### 3. **注意事项** - **TypeScript支持**:在Vue 3 + TypeScript项目中,需显式定义DOM元素类型(如 `HTMLButtonElement`)。 - **性能优化**:高频事件(如实时搜索)推荐防抖;连续触发事件(如滚动)推荐节流[^1]。 - **替代方案**:若需在模板直接使用,可封装为自定义指令(需额外实现 `directive` 逻辑)。 通过以上方法,您可以在Vue 3项目中高效管理事件流,提升应用响应速度用户体验[^1][^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小灰灰学编程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值