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代码
Dec 05 Javascript
js实现将选中值累加到文本框的方法
Aug 12 Javascript
js实现全国省份城市级联下拉菜单效果代码
Sep 07 Javascript
JS实现可关闭的对联广告效果代码
Sep 14 Javascript
利用JS实现简单的瀑布流加载图片效果
Apr 22 Javascript
微信小程序实现的贪吃蛇游戏【附源码下载】
Jan 03 Javascript
vue.js中$set与数组更新方法
Mar 08 Javascript
AngularJS标签页tab选项卡切换功能经典实例详解
May 16 Javascript
JS获取指定月份的天数两种实现方法
Jun 22 Javascript
详解Angular-ui-BootStrap组件的解释以及使用
Jul 13 Javascript
vue项目在安卓低版本机显示空白的原因分析(两种)
Sep 04 Javascript
vue组件之间数据传递的方法实例分析
Feb 12 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
全国FM电台频率大全 - 28 甘肃省
2020/03/11 无线电
php 阴历-农历-转换类代码
2012/01/16 PHP
使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇
2010/05/07 Javascript
Javascript中找到子元素在父元素内相对位置的代码
2012/07/21 Javascript
分享8款优秀的 jQuery 加载动画和进度条插件
2012/10/24 Javascript
jquery select多选框的左右移动 具体实现代码
2013/07/03 Javascript
JS简单实现元素复制示例附图
2013/11/19 Javascript
关于Javascript作用域链的八点总结
2013/12/06 Javascript
jQuery中的$.ajax()方法应用
2014/05/06 Javascript
优化Node.js Web应用运行速度的10个技巧
2014/09/03 Javascript
jQuery()方法的第二个参数详解
2015/04/29 Javascript
Bootstrap中CSS的使用方法
2016/02/17 Javascript
分享javascript、jquery实用代码段
2016/10/20 Javascript
详解js的事件代理(委托)
2016/12/22 Javascript
jquery中有哪些api jQuery主要API
2017/11/20 jQuery
JavaScript实现省市联动过程中bug的解决方法
2017/12/04 Javascript
小程序点击图片实现自动播放视频
2020/05/29 Javascript
JavaScript设计模式之享元模式实例详解
2019/01/17 Javascript
js最实用string(字符串)类型的使用及截取与拼接详解
2019/04/26 Javascript
微信小程序 授权登录详解(附完整源码)
2019/08/23 Javascript
Vue搭建后台系统需要注意的问题
2019/11/08 Javascript
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
2019/11/18 NodeJs
Python中函数的参数定义和可变参数用法实例分析
2015/06/04 Python
Django Web开发中django-debug-toolbar的配置以及使用
2018/05/06 Python
利用python中的matplotlib打印混淆矩阵实例
2020/06/16 Python
Python3 + Appium + 安卓模拟器实现APP自动化测试并生成测试报告
2021/01/27 Python
css3 线性渐变和径向渐变示例附图
2014/04/08 HTML / CSS
纯CSS实现右侧底部悬浮效果(悬浮QQ、微信、微博、邮箱等联系方式)
2015/04/24 HTML / CSS
Priority Pass机场贵宾室会籍计划:全球超过1200间机场贵宾室
2018/08/26 全球购物
教育学专业实习生的自我鉴定
2013/11/26 职场文书
学术会议主持词
2014/03/17 职场文书
毕业答辩开场白范文
2015/05/27 职场文书
企业安全生产检查制度
2015/08/06 职场文书
2015年党风廉政建设个人总结
2015/08/18 职场文书
退休劳动合同怎么写?
2019/10/25 职场文书
Winsows11性能如何? win11性能测评多核竟比Win10差了10%
2021/11/21 数码科技