欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Vue 无限滚动加载指令

程序员文章站 2022-05-14 12:11:36
也不存在什么加载咯, 就是一个判断滚动条是否到达浏览器底部了。 如果到了就触发事件,米到就不处理。 计算公式提简单的 底部等于(0) = 滚动条高度 - 滚动条顶部距离 - 可视高度。 反正结果就是0。 一、获取滚动条位置 二、给根节点绑定滚动事件 vue给body元素绑定滚动条事件,真TMD草蛋。 ......

也不存在什么加载咯, 就是一个判断滚动条是否到达浏览器底部了。 如果到了就触发事件,米到就不处理。

计算公式提简单的   底部等于(0) =  滚动条高度 - 滚动条顶部距离 - 可视高度。  反正结果就是0。

 

一、获取滚动条位置

class scroll {
    static get top() {
        return math.max(document.documentelement.scrolltop || document.body.scrolltop);
    }
    static get clientheight() {
        return math.max(document.documentelement.clientheight || document.body.clientheight);
    }
    static get clientwidth() {
        return math.max(document.documentelement.clientwidth || document.body.clientwidth);
    }
    static get height() {
        return math.max(document.documentelement.scrollheight || document.body.scrollheight);
    }
    static get width() {
        return math.max(document.documentelement.scrollwidth || document.body.scrollwidth);
    }
    static get bottom() {
        return scroll.height - scroll.clientheight - scroll.top;
    }
}

 

二、给根节点绑定滚动事件

vue给body元素绑定滚动条事件,真tmd草蛋。事件绑定上去了 妈的 就是不触发事件。不知道什么鬼问题。

最后直接给根节点html绑定滚动事件。

const on = (function () {
    if (document.addeventlistener) {
        return function (element, event, handler) {
            if (element && event && handler) {
                element.addeventlistener(event, handler, false);
            }
        };
    } else {
        return function (element, event, handler) {
            if (element && event && handler) {
                element.attachevent('on' + event, handler);
            }
        };
    }
})();

 

三、注册全局指令

/**
 * 降低事件执行频率
 */
const downsampler = (function () {
    let result = null;
    return function (time, func) {
        if (!result) {
            result = settimeout(function () {
                func();
                result = null;
            }, time);
        }
    }
})();

 

vue.directive("infinite-scroll", {
    bind(el, binding, vnode) {
        on(window, 'scroll', function () {
            if (typeof binding.value === "function" && scroll.bottom <= 50) {   // 小于50就触发
                downsampler(50, binding.value);  // 降低触发频率
            }
        })
    }
});

 

四、实例:

<div class="app" v-infinite-scroll="coupon">
       <template v-for="item in goods">
            <p>{{item}}</p>
      </template>
</div>
        let v = new vue({
            el: ".app",
            data(){
                return {
                    goods:[]
                }
            },
            methods: {
                coupon() {
                    this.goods.push("你呵呵")
                }
            }
        })

 

演示地址:http://whnba.gitee.io/tkspa/