vue 节流&防抖 自定义指令|函数|ts装饰器

一、vue自定义指令

 1、directive/index.js


export default function initDirective(vue) {
    /** 节流 */
    vue.directive('throttle', {
        inserted: function (el, binding) {
            let stop = false;
            el.addEventListener(binding.arg, (e) => {
                if (stop) return;
                binding.value(e)
                stop = true;
                setTimeout(() => {
                    stop = false
                }, 500)
            })
        }
    })
    /** 防抖 */
    vue.directive('debounce', {
        inserted: function (el, binding) {
            let stopTime;
            el.addEventListener(binding.arg, (e) => {
                clearTimeout(stopTime);
                stopTime = setTimeout(binding.value, 200, e)
            })
        }
    })
}

2、main.js

import Vue from 'vue'
import App from './App.vue'
import initDirective from '@/directive' // 引入
Vue.config.productionTip = false

initDirective(Vue); 执行创建自定义指令

new Vue({
  render: h => h(App),
}).$mount('#app')
<div id="app">
    <div ref="Parent" class="Parent" v-throttle:mousemove="mousemove">
    </div>
    <div ref="Parent" class="Parent" v-debounce:click="Parent"></div>
</div>

注:v-throttle&&v-debounce 冒号(:)之后 为事件名称,等号(=)之后为绑定的事件。

二、函数

1、防抖

function clickFn(){
    console.log('点击')
}
function debounce(callBack) {
    let time
    return function (...props) {
        clearTimeout(time)
        let slef = this;
        time = setTimeout(() => {
            callBack.apply(slef, props)
        }, 300)
    }
}
const fn = debounce(clickFn)

2、节流

function clickFn(){
    console.log('点击')
}
function throttle(callBack) {
  let stop = false;
  return function (...props) {
    if (stop) return;
    callBack.apply(this, props);
    stop = true;
    setTimeout(() => {
      stop = false;
    }, 300);
  };
}
const fn = throttle(clickFn)

三、ts装饰器

1、防抖

function debounce(
    target: any,
    propertyKey: string,
    descriptor: PropertyDescriptor,
) {
    let time
    const oldValue = descriptor.value
    descriptor.value = function(...props) {
        clearTimeout(time)
        time = setTimeout(() => {
            oldValue.apply(this, props)
        }, 300)
    }
}

2、节流

function debounce(
    target: any,
    propertyKey: string,
    descriptor: PropertyDescriptor,
) {
    let stop = false;
    const oldValue = descriptor.value
    descriptor.value = function (...props) {
        if (stop) return;
        oldValue.apply(this, props);
        stop = true;
        setTimeout(() => {
          stop = false;
        }, 300);
  };
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值