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 27 Javascript
Javascript中引用示例介绍
Feb 21 Javascript
JS中的log对象获取以及debug的写法介绍
Mar 03 Javascript
基于javascript实现图片预加载
Jan 05 Javascript
JS实现获取来自百度,Google,soso,sogou关键词的方法
Dec 21 Javascript
Vue.js学习笔记之常用模板语法详解
Jul 25 Javascript
JavaScript折半查找(二分查找)算法原理与实现方法示例
Aug 06 Javascript
解决vue中修改了数据但视图无法更新的情况
Aug 27 Javascript
Vue 封装防刷新考试倒计时组件的实现
Jun 05 Javascript
vue实现div可拖动位置也可改变盒子大小的原理
Sep 16 Javascript
js对象属性名驼峰式转下划线的实例代码
Sep 17 Javascript
vue使用echarts实现折线图
Mar 21 Vue.js
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缓存类代码(附详细说明)
2011/06/09 PHP
分享下PHP register_globals 值为on与off的理解
2013/09/26 PHP
Laravel 实现数据软删除功能
2019/08/21 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
jQuery关于导航条背景切换效果实现示例
2013/09/04 Javascript
connect中间件session、cookie的使用方法分享
2014/06/17 Javascript
安装使用Mongoose配合Node.js操作MongoDB的基础教程
2016/03/01 Javascript
浅谈js继承的实现及公有、私有、静态方法的书写
2016/10/28 Javascript
Angularjs修改密码的实例代码
2017/05/26 Javascript
详解webpack进阶之插件篇
2017/07/06 Javascript
vue.js中引入vuex储存接口数据及调用的详细流程
2017/12/14 Javascript
JavaScript实现删除数组重复元素的5种常用高效算法总结
2018/01/18 Javascript
详解为element-ui的Select和Cascader添加弹层底部操作按钮
2020/02/07 Javascript
10分钟学会js处理json的常用方法
2020/12/06 Javascript
使用Python的Zato发送AMQP消息的教程
2015/04/16 Python
浅谈django的render函数的参数问题
2018/10/16 Python
HTML中fieldset标签概述及使用方法
2013/02/01 HTML / CSS
伦敦时尚生活的缩影:LN-CC
2017/01/24 全球购物
Sport-Thieme荷兰:购买体育用品
2019/08/25 全球购物
屈臣氏越南官网:Watsons越南
2021/01/14 全球购物
美国最大和最受信任的二手轮胎商店:Bestusedtires.com
2020/06/02 全球购物
施华洛世奇新加坡官网:SWAROVSKI新加坡
2020/10/06 全球购物
经贸日语专业个人求职信
2013/12/13 职场文书
自我评价个人范文
2013/12/16 职场文书
《台湾的蝴蝶谷》教学反思
2014/02/20 职场文书
学习全国两会精神心得体会范文
2014/03/17 职场文书
货车司机岗位职责
2014/03/18 职场文书
优秀公益广告词大全
2014/03/19 职场文书
文明礼貌演讲稿
2014/05/12 职场文书
2014年采购员工作总结
2014/11/18 职场文书
本溪水洞导游词
2015/02/11 职场文书
2015年幼儿园班务工作总结
2015/05/12 职场文书
入学证明
2015/06/23 职场文书
小学运动会加油词
2015/07/18 职场文书
php TP5框架生成二维码链接
2021/04/01 PHP
浅谈GO中的Channel以及死锁的造成
2022/03/18 Golang