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 相关文章推荐
出现“不能执行已释放的Script代码”错误的原因及解决办法
Aug 29 Javascript
JavaScript delete 属性的使用
Oct 08 Javascript
js左侧多级菜单动态的解决方案
Feb 01 Javascript
javascript中的关于类型转换的性能优化
Dec 14 Javascript
javascript从右边截取指定字符串的三种实现方法
Nov 29 Javascript
jquery选择器之属性过滤选择器详解
Jan 27 Javascript
jQuery源码解读之addClass()方法分析
Feb 20 Javascript
js实现精确到秒的日期选择器完整实例
Apr 30 Javascript
jQuery实现简单漂亮的Nav导航菜单效果
Mar 29 jQuery
javascript和php使用ajax通信传递JSON的实例
Aug 21 Javascript
angular4 获取wifi列表中文显示乱码问题的解决
Oct 20 Javascript
用JS创建一个录屏功能
Nov 11 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 disk_free_space 返回目录可用空间
2010/05/10 PHP
php图片加中文水印实现代码分享
2012/10/31 PHP
php中将html中的br换行符转换为文本输入中的换行符
2013/03/26 PHP
探讨:parse url解析URL,返回其组成部分
2013/06/14 PHP
PHP实现对xml进行简单的增删改查(CRUD)操作示例
2017/05/19 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
2017/11/16 PHP
为Plesk PHP7启用Oracle OCI8扩展方法总结
2019/03/29 PHP
Javascript 网页水印(非图片水印)实现代码
2010/03/01 Javascript
JS获得浏览器版本和操作系统版本的例子
2014/05/13 Javascript
JavaScript判断IE版本型号
2015/07/27 Javascript
关于js里的this关键字的理解
2015/08/17 Javascript
JavaScript修改作用域外变量的方法
2016/03/25 Javascript
浅谈Angular.js中使用$watch监听模型变化
2017/01/10 Javascript
Node.js数据库操作之查询MySQL数据库(二)
2017/03/04 Javascript
微信小程序中使用javascript 回调函数
2017/05/11 Javascript
发布一款npm包帮助理解npm的使用
2019/01/03 Javascript
Node使用koa2实现一个简单JWT鉴权的方法
2021/01/26 Javascript
[04:54]DOTA2 2017国际邀请赛:上届冠军WINGS采访短片
2017/08/09 DOTA
python实现给数组按片赋值的方法
2015/07/28 Python
Python中list列表的一些进阶使用方法介绍
2015/08/15 Python
python 调用c语言函数的方法
2017/09/29 Python
python实现识别手写数字 python图像识别算法
2020/03/23 Python
Python批量处理csv并保存过程解析
2020/05/16 Python
python3处理word文档实例分析
2020/12/01 Python
快速解决pymongo操作mongodb的时区问题
2020/12/05 Python
10个最常见的HTML5面试题 附答案
2016/06/06 HTML / CSS
九年级家长会邀请函
2014/01/15 职场文书
餐厅经理岗位职责范本
2014/02/17 职场文书
感恩节活动策划方案
2014/05/16 职场文书
公司任命书模板
2014/06/06 职场文书
2015年消防工作总结
2015/04/24 职场文书
抢劫罪辩护词
2015/05/21 职场文书
家庭教育培训学习心得体会
2016/01/14 职场文书
导游词范文之颐和园/重庆/云台山
2019/09/10 职场文书
十大公认最好看的动漫:《咒术回战》在榜,《钢之炼金术师》第一
2022/03/18 日漫
鲲鹏 CentOS 7 安装Python3.7
2022/05/11 Servers