vue以组件或者插件的形式实现throttle或者debounce
更新时间:2019年05月22日 09:24:51 作者:虚光
这篇文章主要介绍了vue以组件或者插件的形式实现throttle或者debounce,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
需求
在业务中,会碰到许多点击请求的情况,在请求前改变一个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>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
webpack+vuex+axios 跨域请求数据的示例代码
本篇文章主要介绍了webpack+vuex+axios 跨域请求数据,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-03-03
vite+vue3+element-plus项目搭建的方法步骤
因为vue3出了一段时间了,element也出了基于vue3.x版本的element-plus,vite打包听说很快,尝试一下,感兴趣的可以了解一下2021-06-06
vue结合Axios+v-for列表循环实现网易健康页面(实例代码)
这篇文章主要介绍了vue结合Axios+v-for列表循环实现网易健康页面,在项目下安装axios,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2022-03-03
vue在响应头response中获取自定义headers操作
这篇文章主要介绍了vue在响应头response中获取自定义headers操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-07-07
elementUI checkBox报错Cannot read property &ap
这篇文章主要为大家介绍了elementUI checkBox报错Cannot read property 'length' of undefined的解决分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-06-06


最新评论