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——表单应用范例
Feb 20 Javascript
jquery根据锚点offset值实现动画切换
Sep 11 Javascript
IE6 hack for js 集锦
Sep 23 Javascript
EasyUI加载完Html内容样式渲染完成后显示
Jul 25 Javascript
深入理解JS实现快速排序和去重
Oct 17 Javascript
基于JS实现横线提示输入验证码随验证码输入消失(js验证码的实现)
Oct 27 Javascript
JavaScript中三种常见的排序方法
Feb 24 Javascript
vue使用jsonp抓取qq音乐数据的方法
Jun 21 Javascript
详解vue-property-decorator使用手册
Jul 29 Javascript
微信小程序获取当前时间及星期几的实例代码
Sep 20 Javascript
elementUI同一页面展示多个Dialog的实现
Nov 19 Javascript
Ajax是什么?Ajax高级用法之Axios技术
Apr 21 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中全面阻止SQL注入式攻击分析小结
2012/01/30 PHP
ThinkPHP模板中判断volist循环的最后一条记录的验证方法
2014/07/01 PHP
PHP实现原比例生成缩略图的方法
2016/02/03 PHP
php array_keys 返回数组的键名
2016/10/25 PHP
Zend Framework入门教程之Zend_Registry组件用法详解
2016/12/09 PHP
jquery 选项卡效果 新手代码
2011/07/08 Javascript
Package.js  现代化的JavaScript项目make工具
2012/05/23 Javascript
JS 排序输出实现table行号自增前端动态生成的tr
2014/08/13 Javascript
JS制作简单的三级联动
2015/03/18 Javascript
JavaScript基本类型值-Number类型
2017/02/24 Javascript
微信小程序canvas写字板效果及实例
2017/06/15 Javascript
jquery实现左右轮播切换效果
2018/01/01 jQuery
使用veloticy-ui生成文字动画效果
2018/02/08 Javascript
NodeJS搭建HTTP服务器的实现步骤
2018/10/12 NodeJs
浅谈Vue使用Cascader级联选择器数据回显中的坑
2020/10/31 Javascript
Python基于递归算法实现的走迷宫问题
2017/08/04 Python
Python实现识别手写数字大纲
2018/01/29 Python
Python内置模块logging用法实例分析
2018/02/12 Python
python实现多人聊天室
2020/03/31 Python
Python中的集合介绍
2019/01/28 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
2019/02/16 Python
简单了解django orm中介模型
2019/07/30 Python
python实现kNN算法识别手写体数字的示例代码
2019/08/16 Python
Python标准库shutil模块使用方法解析
2020/03/10 Python
pycharm中leetcode插件使用图文详解
2020/12/07 Python
python中四舍五入的正确打开方式
2021/01/18 Python
canvas使用注意点总结
2013/07/19 HTML / CSS
美国家喻户晓的保健品品牌:Vitamin World(维他命世界)
2016/08/19 全球购物
渔夫的故事教学反思
2014/02/14 职场文书
岗位说明书范文
2014/05/07 职场文书
运动会口号16字
2014/06/07 职场文书
初中生300字旷课检讨书
2014/11/19 职场文书
幼师辞职信怎么写
2015/02/27 职场文书
单位推荐信范文
2015/03/27 职场文书
社区安全温馨提示语
2015/07/14 职场文书
Python如何识别银行卡卡号?
2021/06/10 Python