vue 实现防抖和节流

        日常开发过程中,可能会有监听鼠标移动或者输入框自动提交等需求。这时有个问题,就是会连续触发事件。如果电脑配置差,可能会卡顿,或者这样造成了资源浪费。对于一个资深前端,这是不允许发生的事,因此,debounce(防抖)和throttle(节流)就出现了。

防抖

        防抖通俗来讲就是一直触发的事件,在没有触发后一定时间内,重新执行事件处理方法。实现方式可以用setTimeout,话不多说,上代码。

创建utils.js文件,把节流方法放这里,

var debounce=(func,delay)=>{
    var timer = null;
    return function() {
        var context = this;
        var args = arguments;
        if (timer) {
            clearTimeout(timer)
        }
        timer = setTimeout(function() {
            func.apply(context, args);
            timer = null;
        }, delay);
    }
}

export default debounce;

然后,在我们的组件里面引入并使用;

<template>
  <div>防抖和节流:{{ num }}</div>
</template>

<script>
import debounce from "./utils";
export default {
  data() {
    return {
      num: 0,
    };
  },
  methods: {
    numAdd() {
      this.num++;
    },
    numA: debounce(function(){this.num++}, 1000),
  },
  mounted() {
    window.onmousemove = () => {
      this.numA();
    };
  },
};
</script>

<style>
</style>

  这里注意:debounce()里面的func必须是上面写法,不然不生效哦!

节流

        节流通俗来讲就是一直触发的事件,在一定时间间隔内执行事件处理方法。实现方式可以用setTimeout。

还是把节流方法放在工具类里,

var Throttle =(func,delay)=>{
    var timer = null;
    return function() {
        var context = this;
        var args = arguments;
        if (!timer) {
            timer = setTimeout(function() {
                func.apply(context, args);
                timer = null;
            }, delay);
        }
    }
}

export default Throttle;

在组件中使用,

<template>
  <div>防抖和节流:{{ num }}</div>
</template>

<script>
import Throttle from "./utils";
export default {
  data() {
    return {
      num: 0,
    };
  },
  methods: {
    numAdd() {
      this.num++;
    },
    numA:Throttle(function(){this.num++}, 1000),
  },
  mounted() {
    window.onmousemove = () => {
      this.numA();
    };
  },
};
</script>

<style>
</style>

        以上就是防抖和节流的用法了,不懂的可以深入去学习一下哦!!!

Vue2中实现防抖节流可以使用Vue的指令和方法来实现。 ## 防抖 防抖实现方法是在一定时间内只执行一次方法,如果在这段时间内又有触发事件的操作,那么计时器就会被重新计时,直到时间结束才会执行方法。 ### 指令实现Vue2中可以使用v-debounce指令来实现防抖: ```html <template> <button v-debounce:click="handleClick">Click me</button> </template> <script> export default { methods: { handleClick() { console.log('Clicked'); } } } </script> ``` 可以看到v-debounce指令绑定在click事件上,这样就会在点击按钮时执行handleClick方法,但是在执行handleClick方法之前会先执行防抖函数。 下面是v-debounce指令的实现: ```javascript Vue.directive('debounce', { inserted: function (el, binding) { let timer; el.addEventListener('click', () => { if (timer) clearTimeout(timer); timer = setTimeout(() => { binding.value(); }, 500) }) } }) ``` 上面的代码实现了一个叫做debounce的指令,它会在元素插入到DOM中时绑定一个click事件,在click事件中执行防抖函数,最后执行传入的回调函数。 ### 方法实现 除了指令,我们也可以在Vue2的方法中实现防抖。 ```html <template> <button @click="debounceClick">Click me</button> </template> <script> export default { methods: { debounce(fn, delay) { let timer; return function () { if (timer) clearTimeout(timer); timer = setTimeout(() => { fn.apply(this, arguments); }, delay) } }, handleClick() { console.log('Clicked'); }, debounceClick: debounce(this.handleClick, 500) } } </script> ``` 上面的代码中我们在Vue2的methods中实现了一个debounce方法,它返回一个函数,这个函数会在delay时间内执行一次fn方法。我们在handleClick方法前面加上了debounce,这样每次点击按钮时就会执行debounceClick方法,而不是直接执行handleClick方法。 ## 节流 节流实现方法是在一段时间内只执行一次方法,如果在这段时间内有多次触发事件的操作,那么只有第一次触发事件的操作会执行方法,其余的操作会被忽略,直到时间结束才会重新计时。 ### 指令实现Vue2中可以使用v-throttle指令来实现节流: ```html <template> <button v-throttle:click="handleClick">Click me</button> </template> <script> export default { methods: { handleClick() { console.log('Clicked'); } } } </script> ``` 可以看到v-throttle指令绑定在click事件上,这样就会在点击按钮时执行handleClick方法,但是在执行handleClick方法之前会先执行节流函数。 下面是v-throttle指令的实现: ```javascript Vue.directive('throttle', { inserted: function (el, binding) { let timer; el.addEventListener('click', () => { if (!timer) { timer = setTimeout(() => { timer = null; binding.value(); }, 500) } }) } }) ``` 上面的代码实现了一个叫做throttle的指令,它会在元素插入到DOM中时绑定一个click事件,在click事件中执行节流函数,最后执行传入的回调函数。 ### 方法实现 除了指令,我们也可以在Vue2的方法中实现节流。 ```html <template> <button @click="throttleClick">Click me</button> </template> <script> export default { methods: { throttle(fn, delay) { let timer; return function () { if (!timer) { timer = setTimeout(() => { timer = null; fn.apply(this, arguments); }, delay) } } }, handleClick() { console.log('Clicked'); }, throttleClick: throttle(this.handleClick, 500) } } </script> ``` 上面的代码中我们在Vue2的methods中实现了一个throttle方法,它返回一个函数,这个函数会在delay时间内执行一次fn方法。我们在handleClick方法前面加上了throttle,这样每次点击按钮时就会执行throttleClick方法,而不是直接执行handleClick方法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值