封装文件的实现思路如下:
封装文件的目的是将防抖和节流的逻辑封装在一个独立的文件中,方便在不同的项目中复用,并使代码更加可读和可维护。
dbucTrtl.js
// 防抖函数
function debounce(func, wait, immediate) {
let timeout; // 定义一个计时器变量,用于延迟执行函数
return function (...args) { // 返回一个包装后的函数
const context = this; // 保存函数执行上下文对象
const later = function () { // 定义延迟执行的函数
timeout = null; // 清空计时器变量
if (!immediate) func.apply(context, args); // 若非立即执行,则调用待防抖函数
};
const callNow = immediate && !timeout; // 是否立即调用函数的条件
clearTimeout(timeout); // 清空计时器
timeout = setTimeout(later, wait); // 创建新的计时器,延迟执行函数
if (callNow) func.apply(context, args); // 如果满足立即调用条件,则立即执行函数
};
}
// 节流函数
function throttle(func, wait) {
let timeout; // 定义一个计时器变量,用于限制函数调用频率
return function (...args) { // 返回一个包装后的函数
const context = this; // 保存函数执行上下文对象
if (!timeout) { // 如果计时器不存在
func.apply(context, args); // 执行函数
timeout = setTimeout(() => {
timeout = null; // 清空计时器变量
}, wait); // 创建计时器,在指定时间后重置计时器变量
}
};
}
export {
debounce,
throttle
}; // 导出防抖函数和节流函数
main.js
// 引入防抖节流函数文件
import { debounce, throttle } from './utils/dbucTrtl.js';
// 在Vue实例上扩展全局方法
Vue.prototype.$debounce = debounce;
Vue.prototype.$throttle = throttle;
当用户点击某个按钮时,我们可以使用防抖函数来避免用户误操作导致多次触发相同的事件。而节流函数可以限制用户点击按钮的频率,防止连续点击导致重复的操作。
下面是一个使用点击事件的防抖和节流函数的案例:
html.vue
<template>
<div>
<button @click="debouncedClick">点击触发防抖函数</button>
<button @click="throttledClick">点击触发节流函数</button>
</div>
</template>
<script>
export default {
created() {
// 使用防抖函数处理点击事件
this.debouncedClick = this.$debounce(this.handleClick, 1000);
// 使用节流函数处理点击事件
this.throttledClick = this.$throttle(this.handleClick, 1000);
},
methods: {
handleClick() {
console.log("按钮点击事件处理中...");
// 在这里编写具体的点击事件处理逻辑
},
},
};
</script>
在以上例子中,有两个按钮,分别绑定了 @click 事件并调用不同的处理方法。debouncedClick 使用防抖函数来处理点击事件,延迟执行 handleClick 方法,以避免用户连续点击导致触发多次事件。throttledClick 使用节流函数来处理点击事件,限制用户点击按钮的频率,确保在一定时间内只触发一次事件。通过这些防抖和节流函数的应用,可以避免用户的误操作并提升用户体验。
防抖的使用场景:
节流的使用场景:
总的来说,防抖适合在需要避免频繁触发事件的场景下使用,而节流适合控制函数的调用频率,避免过多函数调用的场景下使用。
防抖和节流是两种常见的优化技术,用于控制事件的触发频率,以提高性能和用户体验。