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 相关文章推荐
利用JQuery和JS实现奇偶行背景颜色自定义效果
Nov 19 Javascript
JS编程小常识很有用
Nov 26 Javascript
js数组的操作详解
Mar 27 Javascript
JavaScript中数组slice和splice的对比小结
Sep 22 Javascript
给easyui datebox扩展一个清空的实例
Nov 09 Javascript
JS常见疑难点分析之match,charAt,charCodeAt,map,search用法分析
Dec 25 Javascript
Bootstrap 下拉多选框插件Bootstrap Multiselect
Jan 22 Javascript
基于Bootstrap 3 JQuery及RegExp的表单验证功能
Feb 16 Javascript
用jQuery将JavaScript对象转换为querystring查询字符串的方法
Nov 12 jQuery
监控微信小程序中的慢HTTP请求过程详解
Jul 05 Javascript
详解使用JWT实现单点登录(完全跨域方案)
Aug 02 Javascript
three.js着色器材质的内置变量示例详解
Aug 16 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以及MYSQL日期比较方法
2012/11/29 PHP
PHP从二维数组得到N层分类树的实现代码
2016/10/11 PHP
PHP设计模式之命令模式示例详解
2020/12/20 PHP
JavaScript国旗变换效果代码
2008/08/13 Javascript
Javascript 学习书 推荐
2009/06/13 Javascript
10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
2011/06/08 Javascript
javascript定时变换图片实例代码
2013/03/17 Javascript
Jquery实现图片左右自动滚动示例
2013/09/25 Javascript
jQuery插件jQuery-JSONP开发ajax调用使用注意事项
2013/11/22 Javascript
js每隔5分钟执行一次ajax请求的实现方法
2013/11/27 Javascript
jQuery左右滚动支持图片放大缩略图图片轮播代码分享
2015/08/26 Javascript
浅谈Javascript中Object与Function对象
2015/09/26 Javascript
Bootstrap3 Grid system原理及应用详解
2016/09/30 Javascript
js获取指定字符前/后的字符串简单实例
2016/10/27 Javascript
微信小程序通过api接口将json数据展现到小程序示例
2017/01/20 Javascript
Angularjs的键盘事件的绑定
2017/07/27 Javascript
ant design vue中日期选择框混合时间选择器的用法说明
2020/10/27 Javascript
详解ES6 中的Object.assign()的用法实例代码
2021/01/11 Javascript
Python 的 Socket 编程
2015/03/24 Python
Python实现识别手写数字大纲
2018/01/29 Python
sublime python3 输入换行不结束的方法
2018/04/19 Python
python抽取指定url页面的title方法
2018/05/11 Python
selenium跳过webdriver检测并模拟登录淘宝
2019/06/12 Python
解决pyecharts在jupyter notebook中使用报错问题
2020/04/23 Python
Python求平面内点到直线距离的实现
2020/01/19 Python
python如何实现读取并显示图片(不需要图形界面)
2020/07/08 Python
英国领先的在线高尔夫设备零售商:Golfgeardirect
2020/12/11 全球购物
银行批评与自我批评
2014/02/10 职场文书
公司授权委托书范本
2014/04/03 职场文书
三问三解心得体会
2014/09/05 职场文书
运动会稿件100字
2014/09/24 职场文书
2014年班组建设工作总结
2014/12/01 职场文书
社区元宵节活动总结
2015/02/06 职场文书
三好学生个人总结
2015/02/15 职场文书
市场部岗位职责范本
2015/04/15 职场文书
浅谈 JavaScript 沙箱Sandbox
2021/11/02 Javascript