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_01_isPlainObject分析与重构
Oct 20 Javascript
juqery 学习之四 筛选查找
Nov 30 Javascript
一个JQuery写的点击上下滚动的小例子
Aug 27 Javascript
js禁止页面使用右键(简单示例代码)
Nov 13 Javascript
jquery如何判断表格同一列不同行input数据是否重复
May 14 Javascript
js传值后台中文出现乱码的解决方法
Jun 30 Javascript
jquery实现(textarea)placeholder自动换行
Dec 22 Javascript
使用 jQuery 实现表单验证功能
Jul 05 jQuery
Vue集成Iframe页面的方法示例
Dec 12 Javascript
jQuery+CSS实现的table表格行列转置功能示例
Jan 08 jQuery
Vue解析剪切板图片并实现发送功能
Feb 04 Javascript
详解js中的原型,原型对象,原型链
Jul 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
基于mysql的bbs设计(四)
2006/10/09 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(三)
2014/06/23 PHP
Windows下的PHP 5.3.x安装 Zend Guard Loader教程
2014/09/06 PHP
php中的字符编码转换函数用法示例
2014/10/20 PHP
php 根据URL下载远程图片、压缩包、pdf等文件到本地
2019/07/26 PHP
phpstorm最新激活码分享亲测phpstorm2020.2.3版可用
2020/11/22 PHP
动态添加js事件实现代码
2009/03/12 Javascript
jquery实现人性化的有选择性禁用鼠标右键
2014/06/30 Javascript
JS、CSS以及img对DOMContentLoaded事件的影响
2014/08/12 Javascript
Javascript递归打印Document层次关系实例分析
2015/05/15 Javascript
Jquery和JS获取ul中li标签的实现方法
2016/06/02 Javascript
jquery之别踩白块游戏的简单实现
2016/07/25 Javascript
微信小程序 rich-text的使用方法
2017/08/04 Javascript
layui table 表格模板按钮的实例代码
2019/09/21 Javascript
Vue ​v-model相关知识总结
2021/01/28 Vue.js
react项目从新建到部署的实现示例
2021/02/19 Javascript
[50:28]LGD女子学院第三期 DOTA2复仇之魂教学
2013/12/24 DOTA
[57:53]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#3OG VS VP
2016/03/03 DOTA
Python EOL while scanning string literal问题解决方法
2020/09/18 Python
python常见排序算法基础教程
2017/04/13 Python
浅谈python socket函数中,send与sendall的区别与使用方法
2017/05/09 Python
Python实现桶排序与快速排序算法结合应用示例
2017/11/22 Python
Python中用psycopg2模块操作PostgreSQL方法
2017/11/28 Python
python3.6实现学生信息管理系统
2019/02/21 Python
django的ORM操作 删除和编辑实现详解
2019/07/24 Python
Python queue队列原理与应用案例分析
2019/09/27 Python
python爬取微博评论的实例讲解
2021/01/15 Python
班级安全教育实施方案
2014/02/23 职场文书
活动总结怎么写啊
2014/05/07 职场文书
北京奥运会主题口号
2014/06/13 职场文书
感恩教师节演讲稿
2014/09/03 职场文书
我为党旗添光彩演讲稿
2014/09/13 职场文书
计生办班子群众路线教育实践活动个人对照检查材料思想汇报
2014/10/04 职场文书
护士自我推荐信范文
2015/03/24 职场文书
2015年国庆节寄语
2015/08/17 职场文书
先进工作者主要事迹材料
2015/11/03 职场文书