节流、防抖函数封装并测试

<template>
	<div>
		<el-input @input="debounceIpt" v-model="debounceVal" placeholder="防抖" clearable></el-input>
		<el-input @input="throttleIpt" v-model="throttleVal" placeholder="节流" clearable></el-input>
	</div>
</template>

<script>
	export default {
		data() {
			return {
				debounceVal: '',
        throttleVal: ''
			};
		},

    mounted() {
      this.debounceLogFn = this.debounce(this.debounceLog)
      this.throttleLogFn = this.throttle(this.throttleLog)
    },

    methods: {
      // 防抖输入
      debounceIpt(val) {
        this.debounceLogFn(val)
      },

      // 防抖目标操作
      debounceLog(val) {
        console.log(val, 'val+++')
      },

      // 防抖封装
      debounce(fn, delay = 1000, isFirst = true) {
        let timer = null
        let isFirstInner = true

        return function _debounce() {
          // 第一次是否立即执行
          if(isFirstInner && isFirst) {
            fn.apply(this, arguments)
            isFirstInner = false
          }

          if(timer) clearTimeout(timer)

          timer = setTimeout(() => {
            fn.apply(this, arguments)
          }, delay)
        }
      },

      // 节流输入
      throttleIpt(val) {
        this.throttleLogFn(val)
      },  
      
      // 节流目标操作
      throttleLog(val) {
        console.log(val, 'val+++')
      },

      // 节流封装
      throttle(fn, delay = 1000, isFirst = false, isLastest = true) {
        let lastTime = 0
        let isFirstInner = false
        let timer = null

        return function _throttle() {
          let nowTime = +new Date()
          // 第一次是否立即执行
          if(!isFirstInner && !isFirst) {
            lastTime = nowTime
            isFirstInner = true
          }
          let remainTime = nowTime - lastTime

          if(remainTime >= delay) {
            fn.apply(this, arguments)
            lastTime = nowTime
          } else {
            if(timer) clearTimeout(timer)

            timer = setTimeout(() => {
              if(isLastest) fn.apply(this, arguments) // 是否执行最后一次输入
              isFirstInner = false // 第二次输入 首次是否立即执行
            }, delay)
          }
        }
      }
    }
	};
</script>

<style></style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值