vue以組件或者插件的形式實(shí)現(xiàn)throttle或者debounce
需求
在業(yè)務(wù)中,會(huì)碰到許多點(diǎn)擊請(qǐng)求的情況,在請(qǐng)求前改變一個(gè)lock變量(在lock變回來之前,點(diǎn)擊無效),在請(qǐng)求回調(diào)中再改變lock.以確保在,請(qǐng)求回來之前,不會(huì)重復(fù)請(qǐng)求?;蛘哳愃频狞c(diǎn)擊節(jié)流業(yè)務(wù)
實(shí)現(xiàn)方式
指令
<div v-for="a in 3" :key="a" v-demo:getData="a">指令</div> //getData是函數(shù)名,a是傳入的參數(shù) 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){ // 打上標(biāo)記,如果已經(jīng)轉(zhuǎn)換了,就不轉(zhuǎn)了 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; // 時(shí)間 @Prop({ type: String, default: 'throttle' }) public type!: string; // 類型 @Prop() public params!: any; // 傳入?yún)?shù) 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>我是組件內(nèi)容</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('異步數(shù)據(jù)', e) } } </script>
plugin
函數(shù)
function deb(fn: function){ let lock: number return (e) => { if (lock){ clearTimeout(lock) } console.log('創(chuàng)建閉包延遲執(zhí)行') lock = setTimeout(() => { fn(e) }, 1500) } } export {deb}
組件內(nèi)使用
<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>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue使用動(dòng)態(tài)添加路由(router.addRoutes)加載權(quán)限側(cè)邊欄的方式
這篇文章主要介紹了vue使用動(dòng)態(tài)添加路由(router.addRoutes)加載權(quán)限側(cè)邊欄的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06vue 微信分享回調(diào)iOS和安卓回調(diào)出現(xiàn)錯(cuò)誤的解決
這篇文章主要介紹了vue 微信分享回調(diào)iOS和安卓回調(diào)出現(xiàn)錯(cuò)誤的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09Vue2.0 實(shí)現(xiàn)歌手列表滾動(dòng)及右側(cè)快速入口功能
這篇文章主要介紹了Vue2.0實(shí)現(xiàn)歌手列表滾動(dòng)及右側(cè)快速入口功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08基于Vue的前端界面實(shí)現(xiàn)日期時(shí)間實(shí)時(shí)顯示簡(jiǎn)單代碼
今天在項(xiàng)目中有一個(gè)功能是要求顯示北京的實(shí)時(shí)時(shí)間,下面這篇文章主要給大家介紹了關(guān)于如何基于Vue的前端界面實(shí)現(xiàn)日期時(shí)間實(shí)時(shí)顯示的相關(guān)資料,需要的朋友可以參考下2024-01-01使用Vue動(dòng)態(tài)生成form表單的實(shí)例代碼
這篇文章主要介紹了使用Vue動(dòng)態(tài)生成form表單的實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-04-04