防抖和节流各种使用封装记录

在页面按钮上直接使用防止多次点击方法

新建一个公共Js.在main.js中引入

// 防止处理多次点击
function noMultipleClicks(methods, info) {
    // methods是点击后需要执行的函数, info是函数需要传的参数
    let that = this;
    if (that.noClick) {
        // 第一次点击
        if((info && info !== '') || info ==0) {
			that.noClick= false;
            // info是执行函数需要传的参数
			if(info==0){
				info=false
			}
            methods(info);
        } else {
			that.noClick= false;
            methods();
        }
		  
        setTimeout(()=> {
            that.noClick= true;
        }, 10000)
    } else {
        uni.showToast({
        	title:'操作过于频繁,请10秒后重试',
			icon:'none'
        })
    }
}
//导出
export default {
    noMultipleClicks,      // 禁止多次点击
}

// 配置公共方法
import common from './libs/common.js'
Vue.prototype.$noMultipleClicks = common.noMultipleClicks;

使用则是 @click="$noMultipleClicks(clickImg,item)" 第一个参数是事件,第二个参数是事件需传的参数

data() {
            return {
                noClick:true,//在页面设置noClick:true
            }
        }

防抖和节流我一直老是被绕晕。目前以自己的理解封装了2个

函数防抖

原理:当持续触发一个事件时,在n秒内,事件没有再次触发,此时才会执行回调;如果n秒内,又触发了事件,就重新计时适用场景:search远程搜索框:防止用户不断输入过程中,不断请求资源,n秒内只发送1次,用防抖来节约资源按钮提交场景,比如点赞,表单提交等,防止多次提交监听resize触发时, 不断的调整浏览器窗口大小会不断触发resize,使用防抖可以让其只执行一次

函数节流

原理:当频繁的触发一个事件,每隔一段时间, 只会执行一次事件。适用场景:拖拽场景:固定时间内只执行一次, 防止高频率的的触发位置变动监听滚动事件:实现触底加载更多功能屏幕尺寸变化时, 页面内容随之变动,执行相应的逻辑射击游戏中的mousedown、keydown时间

export const debounce=(cb,delay)=>{
	console.log(delay)
    let timer;
    let isFirst = true; //是否是第一次执行
    return function(...arg){
		if(timer) {
			clearTimeout(timer)
			console.log('clear')
		}
        if(isFirst){
            cb.apply(this,arg);
            isFirst = false;
        }else{
			uni.showToast({
				icon:"none",
				title:'操作过于频繁,请勿重复点击'
			})
			timer = setTimeout(()=>{
				console.log('ttttt')
			    cb.apply(this,arg);
			    isFirst = true;
			},delay)
		}
       
		
    }
}


export const thorttle=(callBack,delay,intervalTime)=>{
    var timer=null;  // 定时器变量
    var time=0;  // 时间变量
	let isFirst = true; //是否是第一次执行
    return function(){
        var context=this;
        var curTime=new Date();  // 当前执行的时间
        clearTimeout(timer);  //  清除上次的定时器
        
        if(!time){
            time=curTime;
        }
        // 当前执行时间距离上次执行的时间是否大于等于间隔时间
        if(curTime - time >= intervalTime){
            time=curTime;
            callBack.apply(context,arguments)
        }else{
			console.log('nnnn')
			if(isFirst){
				isFirst = false;
			    callBack.apply(context,arguments)
			}else{
				clearTimeout(timer);  //  清除上次的定时器
				uni.showToast({
					icon:'none',
					title:'请勿频繁点击'
				})
				if(!timer){
					timer=setTimeout(()=>{
					    callBack.apply(context,arguments)
						isFirst = true;
					},delay)
				}
				
			}
			
        }
    }
	}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
防抖节流是两种常用的函数优化技术,可以用来限制函数的执行频率,提高性能和用户体验。 防抖函数的作用是在短时间内连续触发同一事件时,只执行最后一次操作,而忽略之前的操作。可以用于处理频繁触发的事件,比如窗口大小改变、输入框输入等。 下面是一个简单的防抖函数封装示例: ```javascript function debounce(func, delay) { let timer = null; return function(...args) { clearTimeout(timer); timer = setTimeout(() => { func.apply(this, args); }, delay); }; } ``` 使用方式示例: ```javascript function handleInput() { // 处理输入事件 } const debouncedHandleInput = debounce(handleInput, 300); // 创建防抖函数 inputElement.addEventListener('input', debouncedHandleInput); // 绑定防抖函数到输入框的输入事件 ``` 节流函数的作用是在一定时间间隔内只执行一次操作,可以用于处理高频率触发的事件,比如滚动事件、鼠标移动事件等。 下面是一个简单的节流函数封装示例: ```javascript function throttle(func, delay) { let timer = null; return function(...args) { if (timer) return; timer = setTimeout(() => { func.apply(this, args); timer = null; }, delay); }; } ``` 使用方式示例: ```javascript function handleScroll() { // 处理滚动事件 } const throttledHandleScroll = throttle(handleScroll, 300); // 创建节流函数 window.addEventListener('scroll', throttledHandleScroll); // 绑定节流函数到窗口的滚动事件 ``` 以上是基本的防抖节流函数封装示例,可以根据实际需求进行调整和扩展。希望能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值