『函数封装』之防抖与节流

文章内容

  • 防抖函数封装
  • 节流函数封装

一、文章介绍

 在之前我向大家简单的介绍了一下防抖、节流两个函数方法的用处以及简单的封装了这两个函数,具体可见防抖、节流的介绍这一篇文章。本篇文章基于其的基础上,对两个函数进行一定的拓展,封装两个更完整的防抖、节流函数。

二、简单回顾一下防抖、节流

 防抖和节流两个函数目的都是让存在持续触发的操作(如input事件、mouse相关的事件)减少触发频率,因为按照正常的思维,输入和鼠标移动事件有效的触发肯定是在最后几次。防抖和节流就很有效的解决了输入和鼠标移动中无效触发导致服务器压力增大的问题。

三、防抖与节流的区别

 防抖与节流虽然目的类似,两者的核心都是使用setTiemout定时器来延迟事件函数的执行。但实现的方式还是有所不同的,大家在使用的时候再琢磨哪一种方式更加合适一些。
 函数防抖是通过不断的清除上一次执行设定的定时器,再生成新的定时器的方式来延迟函数执行,这种方式会导致只要用户在不停的操作,目标函数就永远不会执行,直到用户停止操作且等待所需延迟时间之后,函数才会执行一次
 函数节流则是可以通过与上一次操作时间比对的方式,当本次操作的时间与上次操作时间间隔大于延迟时间时,就允许一次函数的执行,将本次执行时间覆盖上次执行时间,循环此操作。因此,函数节流使得函数在一定时间内一定会执行一次
 相较而言,笔者更喜欢使用函数节流,因为可以使得用户在一定时间内得到页面的响应、反馈。当然,我们也可以对函数防抖进行拓展,使得它在第一次执行时先执行一次函数,再进行防抖操作。

四、基础版防抖节流

 两种函数的思想以及执行流程,我以及在上一节的区别中大概阐述了,我也会在注释上标注出来。

函数防抖

函数防抖

测试代码

结果就不展示了,有兴趣的朋友可以自己测试一下

测试代码

函数节流

节流基础

测试代码

节流基础事件绑定

五、拓展函数防抖、节流

函数防抖

 我们希望给函数防抖一个立即执行的功能,当用户第一次输入时先执行一次目标函数,接着再开始防抖操作,且我们希望可以手动的将函数防抖中的定时器取消。
防抖拓展

测试代码

测试代码

函数节流

 函数节流并没有做太多的拓展,因为节流本就是在一定的时间内执行一次目标函数。我这里只对函数节流添加了在外界取消定时器的拓展,其余的大家可以自行添加。
节流拓展

测试代码

测试代码

六、总结

 以上便是本篇文章的全部内容,感谢您的阅读。我是Donp1,下次见🐻‍❄️
 代码仓库:博客相关代码仓库

<think>好的,我现在需要帮助用户解决在Vue3中全局封装防抖节流函数的问题。首先,我得回忆一下防抖节流的基本概念以及它们在Vue中的应用场景。防抖(debounce)是指在一定时间内只执行最后一次操作,常用于输入框搜索建议;而节流(throttle)则是每隔一定时间执行一次,适用于滚动事件或窗口调整等高频触发的情况。 用户的需求是全局封装,这意味着他们希望在整个Vue应用中方便地使用这些函数,而不必在每个组件中单独引入或定义。根据之前的引用内容,用户可能已经看过一些Vue2和Vue3的示例,但需要更具体的Vue3全局方法。 接下来,我需要考虑Vue3的全局特性,比如使用app.config.globalProperties来添加全局属性或方法。同时,Vue3的组合式API可能会影响封装的方式,但用户可能更倾向于传统的方法封装,以便在模板中直接使用。 然后,参考用户提供的引用,特别是引用[2]、[4]和[5],其中提到了使用闭包和setTimeout实现防抖节流。需要将这些方法适配到Vue3的全局上下文中。例如,在Vue3中,可以通过插件的形式封装,然后在main.js中安装,这样所有组件都可以访问。 另外,用户提供的示例代码中有一些实现细节需要注意,比如防抖函数中的立即执行选项,以及节流函数中定时器的管理。确保封装后的函数能够正确处理this上下文,这在Vue3中可能有所不同,因为组合式API更推荐使用setup函数,但全局方法可能仍然需要绑定到实例上。 然后,我需要考虑如何编写示例代码,展示如何在组件中使用这些全局方法。比如,在模板中使用@click="throttle(handleClick, 1000)",或者在方法中调用this.debounce(...)。同时,需要确保TS类型声明(如果用户使用TypeScript)或者至少提供基本的类型提示。 可能还需要处理一些边缘情况,比如函数参数的传递、取消未执行的防抖节流函数等。不过,根据用户的需求,可能只需要基础实现即可,高级功能可以后续扩展。 最后,要生成相关问题,帮助用户进一步学习,比如性能优化、应用场景、第三方库的比较等。这些问题应该封装全局函数相关,并且基于用户之前的问题,引导他们深入理解。 总结步骤: 1. 定义防抖节流函数,使用闭包和定时器。 2. 在Vue3中通过app.config.globalProperties注册为全局方法。 3. 创建Vue插件以便于安装。 4. 在main.js中安装插件。 5. 提供组件中的使用示例,包括事件处理和方法调用。 6. 添加TypeScript类型声明(可选但推荐)。 7. 生成相关问题,促进深入学习。</think>### Vue3 全局防抖/节流函数封装指南 在Vue3中全局封装防抖(debounce)和节流(throttle)函数,可以通过以下步骤实现: #### 一、核心实现原理 1. **防抖函数**:延迟执行直到停止触发后的指定时间$t$,若重复触发则重新计时[^2] $$f_{debounce}(f,t) = \lim_{n→∞} \underbrace{\text{setTimeout}(f,t)}_{\text{每次触发重置计时器}}$$ 2. **节流函数**:固定时间间隔$t$内只执行一次,稀释触发频率[^4] $$f_{throttle}(f,t) = \begin{cases} \text{立即执行} & \text{首次触发} \\ \text{锁定执行} & \text{间隔期内} \end{cases}$$ #### 二、全局封装实现 ```typescript // utils/throttleDebounce.ts type Func = (...args: any[]) => void; export const debounce = (fn: Func, delay = 300) => { let timer: ReturnType<typeof setTimeout>; return (...args: any[]) => { clearTimeout(timer); timer = setTimeout(() => fn(...args), delay); }; }; export const throttle = (fn: Func, limit = 300) => { let throttling = false; return (...args: any[]) => { if (!throttling) { fn(...args); throttling = true; setTimeout(() => throttling = false, limit); } }; }; ``` #### 三、注册全局属性 ```typescript // plugins/throttleDebounce.ts import { App } from 'vue'; import { debounce, throttle } from '@/utils/throttleDebounce'; export default { install(app: App) { app.config.globalProperties.$debounce = debounce; app.config.globalProperties.$throttle = throttle; } }; ``` #### 四、在main.ts中安装 ```typescript import { createApp } from 'vue' import throttleDebounce from './plugins/throttleDebounce' const app = createApp(App) app.use(throttleDebounce) ``` #### 五、组件中使用示例 ```vue <template> <!-- 按钮防抖点击 --> <button @click="$debounce(submitForm, 500)">提交</button> <!-- 滚动节流 --> <div @scroll="$throttle(handleScroll, 1000)"></div> </template> <script setup> // 方法级使用 const searchInput = (text) => { console.log('Search:', text); } const debouncedSearch = debounce(searchInput, 500); </script> ``` #### 六、TS类型增强(可选) ```typescript // global.d.ts declare module '@vue/runtime-core' { interface ComponentCustomProperties { $debounce: (fn: (...args: any[]) => void, delay?: number) => void; $throttle: (fn: (...args: any[]) => void, limit?: number) => void; } } ``` #### 最佳实践建议: 1. **参数传递**:使用箭头函数保持上下文 ```vue <button @click="$debounce(() => saveData(id), 500)"></button> ``` 2. **事件对象处理**:需要显式传递event对象 ```vue <input @input="$debounce((e) => search(e.target.value), 300)" /> ``` 3. **内存管理**:在组件卸载时清除定时器 ```typescript onUnmounted(() => { clearTimeout(timer); throttling = false; }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Donp1

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

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

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

打赏作者

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

抵扣说明:

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

余额充值