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 相关文章推荐
Javascript自定义函数判断网站访问类型是PC还是移动终端
Jan 10 Javascript
js实现的点击div区域外隐藏div区域
Jun 30 Javascript
jQuery中prevAll()方法用法实例
Jan 08 Javascript
jQuery实现带幻灯的tab滑动切换风格菜单代码
Aug 27 Javascript
js电话号码验证方法
Sep 28 Javascript
Node.js 文件夹目录结构创建实例代码
Jul 08 Javascript
jQuery autoComplete插件两种使用方式及动态改变参数值的方法详解
Oct 24 Javascript
微信小程序 省市区选择器实例详解(附源码下载)
Jan 05 Javascript
深入理解JavaScript中的for循环
Feb 07 Javascript
原生JS实现列表内容自动向上滚动效果
May 22 Javascript
利用百度echarts实现图表功能简单入门示例【附源码下载】
Jun 10 Javascript
Vue.js中的extend绑定节点并显示的方法
Jun 20 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
印尼林东PWN黄金曼特宁咖啡豆:怎么冲世界上最醇厚的咖啡冲煮教程
2021/03/03 冲泡冲煮
PHP的Yii框架的基本使用示例
2015/08/21 PHP
ThinkPHP框架实现导出excel数据的方法示例【基于PHPExcel】
2018/05/12 PHP
浅谈php调用python文件
2019/03/29 PHP
让插入到 innerHTML 中的 script 跑起来的实现代码
2006/07/01 Javascript
Tab页界面,用jQuery及Ajax技术实现
2009/09/21 Javascript
jquery判断checkbox(复选框)是否被选中的代码
2010/10/20 Javascript
javascript奇异的arguments分析
2010/10/20 Javascript
多次注册事件会导致一个事件被触发多次的解决方法
2013/08/12 Javascript
javascript 上下banner替换具体实现
2013/11/14 Javascript
jquery 表格排序、实时搜索表格内容(附图)
2014/05/19 Javascript
简单易用的倒计时js代码
2014/08/04 Javascript
AngularJS中实现用户访问的身份认证和表单验证功能
2016/04/21 Javascript
字符串反转_JavaScript
2016/04/28 Javascript
移动端点击态处理的三种实现方式
2017/01/12 Javascript
jQuery获取单选按钮radio选中值与去除所有radio选中状态的方法
2017/05/20 jQuery
Vue中的数据监听和数据交互案例解析
2017/07/12 Javascript
vue element upload组件 file-list的动态绑定实现
2019/10/11 Javascript
vue如何在用户要关闭当前网页时弹出提示的实现
2020/05/31 Javascript
vue打开其他项目页面并传入数据详解
2020/11/25 Vue.js
Python深入学习之装饰器
2014/08/31 Python
Python进阶-函数默认参数(详解)
2017/05/18 Python
Python实现矩阵加法和乘法的方法分析
2017/12/19 Python
详解Python3注释知识点
2019/02/19 Python
Ubuntu18.04中Python2.7与Python3.6环境切换
2019/06/14 Python
Python字符串的修改方法实例
2019/12/19 Python
Python连接mysql数据库及简单增删改查操作示例代码
2020/08/03 Python
python中Django文件上传方法详解
2020/08/05 Python
使用CSS禁止textarea调整大小功能的方法
2015/03/13 HTML / CSS
html5 input输入实时检测以及延时优化
2018/07/18 HTML / CSS
萌新的HTML5 入门指南
2020/11/06 HTML / CSS
美国受信赖的教育产品供应商:Nest Learning
2018/06/14 全球购物
代码中finally中的代码会不会执行
2012/02/06 面试题
重大事项社会稳定风险评估方案
2014/06/15 职场文书
护士实习求职信
2014/06/22 职场文书
2014年银行工作总结范文
2014/11/12 职场文书