美文网首页
vue 中使用防抖和节流,防止重复点击或重复上拉加载

vue 中使用防抖和节流,防止重复点击或重复上拉加载

作者: Iterate | 来源:发表于2020-11-30 00:28 被阅读0次
    
    /**
     * 函数防抖 (只执行最后一次点击)
     * @param fn
     * @param delay
     * @returns {Function}
     * @constructor
     */
    export const Debounce = (fn, t) => {
        let delay = t || 500;
        let timer;
        console.log(fn)
        console.log(typeof fn)
        return function () {
            let args = arguments;
            if(timer){
                clearTimeout(timer);
            }
            timer = setTimeout(() => {
                timer = null;
                fn.apply(this, args);
            }, delay);
        }
    };
     
     
    /**
     * 函数节流
     * @param fn
     * @param interval
     * @returns {Function}
     * @constructor
     */
    export const Throttle = (fn, t) => {
        let last;
        let timer;
        let interval = t || 500;
        return function () {
            let args = arguments;
            let now = +new Date();
            if (last && now - last < interval) {
                clearTimeout(timer);
                timer = setTimeout(() => {
                    last = now;
                    fn.apply(this, args);
                }, interval);
            } else {
                last = now;
                fn.apply(this, args);
            }
        }
    };
    

    用法:

    methods:{
        getAliyunData:Throttle(function(){
        ...
         },1000),
    }
    

    案例2:
    防抖和节流是我们在开发过程中常用优化性能的方式

    在 vue 中怎么使用:

    1、在公共方法中(如 public.js 中),加入函数防抖和节流方法

    // 防抖
    export function _debounce(fn, delay) {
     
        var delay = delay || 200;
        var timer;
        return function () {
            var th = this;
            var args = arguments;
            if (timer) {
                clearTimeout(timer);
            }
            timer = setTimeout(function () {
                timer = null;
                fn.apply(th, args);
            }, delay);
        };
    }
    // 节流
    export function _throttle(fn, interval) {
        var last;
        var timer;
        var interval = interval || 200;
        return function () {
            var th = this;
            var args = arguments;
            var now = +new Date();
            if (last && now - last < interval) {
                clearTimeout(timer);
                timer = setTimeout(function () {
                    last = now;
                    fn.apply(th, args);
                }, interval);
            } else {
                last = now;
                fn.apply(th, args);
            }
        }
    }
    

    2、在需要使用的组件引用

    import { _debounce } from "@/utils/public";
    

    3、在 methods 中使用

      methods: {
        // 改变场数
        changefield: _debounce(function(_type, index, item) {
            // do something ...
        }, 200)
      }
    

    相关文章

      网友评论

          本文标题:vue 中使用防抖和节流,防止重复点击或重复上拉加载

          本文链接:https://www.haomeiwen.com/subject/feblwktx.html