vue中使用iview ui(Button)组件按钮实现节流, 防抖功能

本文介绍了防抖和节流两种技术在JavaScript中的作用,如何在Vue中使用自定义指令实现防抖和节流功能,以及它们在处理频繁和持续触发事件时的应用场景。
摘要由CSDN通过智能技术生成

1: 了解节流跟防抖的作用:

防抖(Debouncing)和节流(Throttling)都是用于限制某个函数执行频率的技术,通常用于处理频繁触发的事件,例如浏览器窗口的大小变化、滚动事件、输入框输入事件等。

防抖(Debouncing):
防抖的基本思想是,当事件触发后,不立即执行对应的处理函数,而是等待一段时间(防抖时间间隔),如果在这段时间内没有再次触发该事件,那么才执行对应的处理函数。

在实际应用中,防抖常用于处理输入框输入事件,以减少输入时频繁的请求或计算操作。例如,在用户输入搜索关键词时,防抖可以确保只有在用户停止输入一段时间后才触发搜索操作,从而减轻服务器压力。

节流(Throttling):
节流的基本思想是,当事件触发后,如果在一定的时间间隔内再次触发,那么将被忽略,只有在时间间隔过去后才执行下一次。与防抖不同的是,节流会以固定的时间间隔执行一次处理函数,而不管事件触发的频率。

节流常用于处理事件的持续触发,例如页面滚动事件。通过节流,你可以控制在一定时间内只执行一次滚动处理,避免过于频繁的触发,提高性能。

区别:
触发时机:

防抖:只有在事件停止触发一段时间后才执行。
节流:以固定的时间间隔执行一次,不管事件触发频率多高。
执行次数:

防抖:只执行一次,通常是在最后一次触发事件后。
节流:以固定间隔执行,可能会执行多次,但频率受控。
适用场景:

防抖:适用于处理频繁触发但只关心最后一次的情况,例如输入框输入事件、搜索操作。
节流:适用于处理持续触发但希望控制执行频率的情况,例如滚动事件、resize事件。

2: 创建一个外部js文件 throttleDirective.js(此文件演示包含了防抖/节流, 实际开发注意命名)

export default {
  // 用于给按钮添加节流功能
  install (Vue) {
    Vue.directive('throttle', {
      bind (el, binding, vnode) {
        let timeout
        el.addEventListener('click', () => {
          if (!timeout) {
            timeout = setTimeout(() => {
              timeout = null
            }, parseInt(binding.arg) || 300) // 默认节流时间为300毫秒
            binding.value()
          }
        })
      }
    })
  }
}
export default {
  // 用于给按钮添加防抖功能
  install (Vue) {
    Vue.directive('debounce', {
      bind (el, binding, vnode) {
        let timeout
        const delay = 2000 // 默认时间

        el.addEventListener('click', () => {
          clearTimeout(timeout)

          timeout = setTimeout(() => {
            binding.value()
          }, delay)
        })
      }
    })
  }
}

3: 在main.js文件里面引用这个文件

import ThrottleDirective from './utils/throttleDirective'
Vue.use(ThrottleDirective)

4: 组件里面使用

无传参写法
<Button class="form-ivu-btn" type="primary" v-throttle:500="onSave">保存</Button>
有传参写法
<Button class="form-ivu-btn" type="primary" v-throttle:500="() => onSave('参数')">保存</Button>
这里要使用箭头函数, 因为在Vue中,如果使用 v-throttle:500="onSave()",它会立即调用 onSave 函数并将返回值传递给 v-throttle 指令,这样就不再是一个函数了。而 v-throttle 期望的是一个函数,因此会导致报错。
  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值