防抖和节流在vue中的具体使用

前言

防抖和节流属于性能优化的知识。它们都是基于短时间内高频的操作场景,例如输入,点击,滚动等,下面介绍下结合vue组件的具体使用


一、防抖

  • 对于短时间内连续触发的事件,防抖就是不立即执行事件,给出一个时间期限(如1000毫秒),若在时间期限内再次触发,取消之前时间计时,重新开始计时;若无再次触发,则在时间期限到后执行。
  • 最终效果:如果短时间内高频触发同一事件,只会执行一次函数。
  • 实际应用
    搜索框搜索输入。只需用户最后一次输入完,再发送请求
    手机号、邮箱验证输入检测
    窗口大小Resize。只需窗口调整完成后,计算窗口大小。防止重复渲染。

示例一:在组件中定义防抖函数,全局计时器放在data中定义

<template>
	<button @click="clickme">点击按钮</button>
</template>
<script>
export default {
  data() {
    return {
      timer: null
    }
  },
  methods: {
    clickme() {
      console.log('click')
      this.debounce(this.clickHandle, 2000);
    },
    clickHandle() {
      console.log('click handle')
    },
    debounce(fn, delay) {
       this.timer && clearTimeout(this.timer); // 存在计时器就销毁
       this.timer = setTimeout(fn, delay);
    }
  }
}
</script>

示例二:在工具库中定义防抖函数Debounce,全局timer通过闭包实现

export const Debounce = function(fn, delay) {
    var timer = null;
    return function () {
        console.log('timer', timer)
        if (timer) {
            clearTimeout(timer);
        }
        timer = setTimeout(fn, delay);
    }
}
<template>
	<button @click="clickme">点击按钮</button>
</template>
<script>
import {Debounce} from '../utils/common.js'

export default {
  methods: {
    clickme: Debounce(function() {
      console.log('click handle')
    }, 2000)
  }
}
</script>

二、节流

  • 对于短时间内连续触发的事件,节流就是,给出一个时间期限(如1000毫秒),每隔一个时间期限后才触发执行,其他时间均为无效,不执行状态。
  • 最终效果:如果短时间内高频触发同一事件,每隔一个设定的时间间隔才执行一次。
  • 实际应用:
    scroll滚动加载,加载更多或滚到底部监听
    搜索联想功能
    高频点击提交,表单重复提交

方案一:setTimeout+valid标志位

//...
data() {
    return {
      timer: null,
      valid: true,
      time: Date.now(),
    }
},
methods: {
	clickme() {
      console.log('click')
      this.throttle(this.clickHandle, 2000);
    },
    clickHandle() {
      console.log('click handle')
    },
	throttle(fn, delay) {
      if(!this.valid) {
        return false
      }
      this.valid = false;
      setTimeout(() => {
        fn(); // 执行
        this.valid = true; // 执行完,状态重新激活
      }, delay)
    }
}

方案二:时间戳

clickme() {
      console.log('click')
      this.throttle2(this.clickHandle, 2000);
},
clickHandle() {
      console.log('click handle')
},
throttle2(fn, delay) {
     if(Date.now() - this.time >= delay) {
        fn();
        this.time = Date.now();
     }
}

总结

开发时的实际使用场景:Input输入实时搜索、页面resize重新渲染(防抖)、滚动条onscroll事件、表单提交

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值