Vue 无限滚动加载指令实现方法
程序员文章站
2023-12-03 15:32:58
也不存在什么加载咯, 就是一个判断滚动条是否到达浏览器底部了。 如果到了就触发事件,米到就不处理。
计算公式提简单的 底部等于(0) = ...
也不存在什么加载咯, 就是一个判断滚动条是否到达浏览器底部了。 如果到了就触发事件,米到就不处理。
计算公式提简单的 底部等于(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("你呵呵") } } })
演示地址:
总结
以上所述是小编给大家介绍的vue 无限滚动加载指令实现方法,希望对大家有所帮助