vue以组件或者插件的形式实现throttle或者debounce


Posted in Javascript onMay 22, 2019

需求

在业务中,会碰到许多点击请求的情况,在请求前改变一个lock变量(在lock变回来之前,点击无效),在请求回调中再改变lock.以确保在,请求回来之前,不会重复请求。或者类似的点击节流业务

实现方式

指令

<div v-for="a in 3" :key="a" v-demo:getData="a">指令</div>
 //getData是函数名,a是传入的参数
  directives: {
  demo: {
   bind(el: Element, binding: any, vnode: VNode) {
    const that: any = vnode.context
    // console.log(binding, vnode)
    // console.log(binding.arg, binding.value)
    if (!that[binding.arg].isBind){ // 打上标记,如果已经转换了,就不转了
     that[binding.arg] = deb(that[binding.arg])
     that[binding.arg].isBind = true
    }
    el.addEventListener('click', function T(event: Event): void{
     that[binding.arg](binding.value)
    })
   },
  },
 },

组件

子组件

<template>
 <div>
  <div @click="senClick">
   <slot></slot>
  </div>
 </div>
</template>
<script lang="ts">
import Vue from 'vue';
import { Component, Prop } from 'vue-property-decorator';
@Component({})
export default class Child extends Vue {
 @Prop({ type: Number, default: 500 }) public timeOut!: number; // 时间
 @Prop({ type: String, default: 'throttle' }) public type!: string; // 类型
 @Prop() public params!: any; // 传入参数
 public message: string = 'Hello';
 public throttleLock: boolean = false;
 public debounceLock: number = 0;
 public time: any;
 public senClick(): void {
  console.log(this.timeOut, this.type, this.params);
  if (this.type === 'throttle') {
   if (this.throttleLock) {
    return;
   }
   this.throttleLock = true;
   setTimeout(() => {
    this.throttleLock = false;
   }, this.timeOut);
   this.$emit('myClick', this.params);
  } else if (this.type === 'debounce') {
   if (this.debounceLock) {
    clearTimeout(this.debounceLock);
   }
   this.debounceLock = setTimeout(() => {
    this.$emit('myClick', this.params);
   }, this.timeOut);
  } else {
   this.$emit('myClick', this.params);
  }
 }
}
</script>

<style scoped lang='stylus'>
div {
 width: 100%;
 height: 100%;
}
</style>

父组件

<template>
 <div class="home">
   <throttle-and-debounce @myClick="getData" :time="500" type="throttle" params="123">
    <div>我是组件内容</div>
   </throttle-and-debounce>
 </div>
</template>
import { Component, Vue } from 'vue-property-decorator';
import throttleAndDebounce from '@/components/throttleAndDebounce.vue'; 
@Component({
 components: {
  throttleAndDebounce,
 },
})
export default class home extends Vue {
public getData(e: any){
   console.log('异步数据', e)
  }
}

</script>

plugin

函数

function deb(fn: function){
 let lock: number
 return (e) => {
  if (lock){
   clearTimeout(lock)
  }
  console.log('创建闭包延迟执行')
  lock = setTimeout(() => {
   fn(e)
  }, 1500)
 }
}
export {deb}

组件内使用

<template>
 <div class="home">
  <div @click="func(123)">function</div>
 </div>
</template>
<script lang="ts">
import { Component, Vue } from 'vue-property-decorator';
import {deb} from '@/assets'
@Component({
 components: {
  throttleAndDebounce,
 },
})
export default class home extends Vue {
   public beforeCreate(){
     this.func = deb((e: {a: number}) => {
     console.log('this', e)
    })
   }
}
</script>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript之文件操作
Mar 07 Javascript
JavaScript 闭包深入理解(closure)
May 27 Javascript
JavaScript实现自动切换图片代码
Oct 11 Javascript
JavaScript仿支付宝6位数字密码输入框
Dec 29 Javascript
关于iframe跨域POST提交的方法示例
Jan 15 Javascript
js实现网页定位导航功能
Mar 07 Javascript
JS获取input[file]的值并显示在页面的实现方法
Mar 09 Javascript
vue中v-for循环给标签属性赋值的方法
Oct 18 Javascript
vue 内置过滤器的使用总结(附加自定义过滤器)
Dec 11 Javascript
关于node-bindings无法在Electron中使用的解决办法
Dec 18 Javascript
深入理解javascript prototype的相关知识
Sep 19 Javascript
微信小程序批量监听输入框对按钮样式进行控制的实现代码
Oct 12 Javascript
JavaScript函数式编程(Functional Programming)箭头函数(Arrow functions)用法分析
May 22 #Javascript
JavaScript函数式编程(Functional Programming)高阶函数(Higher order functions)用法分析
May 22 #Javascript
浅谈VUE防抖与节流的最佳解决方案(函数式组件)
May 22 #Javascript
详解在React-Native中持久化redux数据
May 22 #Javascript
微信小程序的注册页面包含倒计时验证码、获取用户信息
May 22 #Javascript
JavaScript函数式编程(Functional Programming)纯函数用法分析
May 22 #Javascript
jQuery Migrate 插件用法实例详解
May 22 #jQuery
You might like
php统计时间和内存使用情况示例分享
2014/03/13 PHP
yii分页组件用法实例分析
2015/12/28 PHP
Yii清理缓存的方法
2016/01/06 PHP
JS获取IUSR_机器名和IWAM_机器名帐号的密码
2006/12/06 Javascript
AngularJS入门教程之 XMLHttpRequest实例讲解
2016/07/27 Javascript
微信小程序 网络API Websocket详解
2016/11/09 Javascript
jquery编写日期选择器
2017/03/16 Javascript
JavaScript函数节流的两种写法
2017/04/07 Javascript
Vue.js仿Metronic高级表格(二)数据渲染
2017/04/19 Javascript
Vuejs入门教程之Vue生命周期,数据,手动挂载,指令,过滤器
2017/04/19 Javascript
AngularJS实现的回到顶部指令功能实例
2017/05/17 Javascript
react router4+redux实现路由权限控制的方法
2018/05/03 Javascript
在Vue中获取组件声明时的name属性方法
2018/09/12 Javascript
js实现拾色器插件(ColorPicker)
2020/05/21 Javascript
[01:14]TI珍贵瞬间系列(六):冠军
2020/08/30 DOTA
Python群发邮件实例代码
2014/01/03 Python
Python实现包含min函数的栈
2016/04/29 Python
Python中optparser库用法实例详解
2018/01/26 Python
python实现隐马尔科夫模型HMM
2018/03/25 Python
在python中pandas的series合并方法
2018/11/12 Python
使用python绘制3维正态分布图的方法
2018/12/29 Python
django中SMTP发送邮件配置详解
2019/07/19 Python
Python turtle库绘制菱形的3种方式小结
2019/11/23 Python
使用Django实现把两个模型类的数据聚合在一起
2020/03/28 Python
python DES加密与解密及hex输出和bs64格式输出的实现代码
2020/04/13 Python
css3气泡 css3关键帧动画创建的动态通知气泡
2013/02/26 HTML / CSS
Weblogic的布署方式
2013/08/23 面试题
营销主管自我评价怎么写
2013/09/19 职场文书
护理专业的自荐信
2013/10/22 职场文书
重阳节登山活动方案
2014/02/03 职场文书
党的群众路线教育实践活动制度建设计划方案
2014/10/31 职场文书
2015年发展党员工作总结报告
2015/03/31 职场文书
nginx 防盗链防爬虫配置详解
2021/03/31 Servers
详解mysql三值逻辑与NULL
2021/05/19 MySQL
Win11任务栏太宽了怎么办?一招解决Win11任务栏太宽问题
2021/11/21 数码科技
分布式架构Redis中有哪些数据结构及底层实现原理
2022/03/13 Redis