Vue 无限滚动加载指令
也不存在什么加载咯, 就是一个判断滚动条是否到达浏览器底部了。 如果到了就触发事件,米到就不处理。
计算公式提简单的 底部等于(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/
Vue 无限滚动加载指令的更多相关文章
- Angular: 使用 RxJS Observables 来实现简易版的无限滚动加载指令
		我使用 angular-cli 来搭建项目. ng new infinite-scroller-poc --style=scss 项目生成好后,进入 infinite-scroller-poc 目录下 ... 
- Vue无限滚动加载数据
		Web项目经常会用到下拉滚动加载数据的功能,今天就来种草Vue-infinite-loading 这个插件,讲解一下使用方法! 第一步:安装 npm install vue-infinite-load ... 
- 基于 Vue.js 的移动端组件库mint-ui实现无限滚动加载更多
		通过多次爬坑,发现了这些监听滚动来加载更多的组件的共同点, 因为这些加载更多的方法是绑定在需要加载更多的内容的元素上的, 所以是进入页面则直接触发一次,当监听到滚动事件之后,继续加载更多, 所以对于无 ... 
- 使用 Angular 和 RxJS 实现的无限滚动加载
		无限滚动加载应该是怎样的? 无限滚动加载列表在用户将页面滚动到指定位置后会异步加载数据.这是避免寻主动加载(每次都需要用户去点击)的好方法,而且它能真正保持应用的性能.同时它还是降低带宽和增强用户体验 ... 
- PHP+InfiniteScroll实现网页无限滚动加载数据实例
		PHP+InfiniteScroll实现网页无限滚动加载数据实例,实现原理:当滚动条到底离网页底部一定长度的时候,向后台发送页数并获取数据. 首先我们在页面上先放置10条数据,即第一页,每一项都是p标 ... 
- vue2.0无限滚动加载数据插件
		做vue项目用到下拉滚动加载数据功能,由于选的UI库(element)没有这个组件,就用Vue-infinite-loading 这个插件代替,使用中遇到的一些问题及使用方法,总结作记录! 安装: ... 
- infinite-scroll插件无限滚动加载数据的使用
		网上对于infinite-scroll插件使用的例子不多.但由于它的出现,鼓吹了瀑布流形式的页面展示方式,所以不得不了解了解这种新的分页方式. 官网上有对infinite-scroll的详细描述,但一 ... 
- 【无限滚动加载数据】—infinite-scroll插件的使用
		网上对于infinite-scroll插件使用的例子不多.但由于它的出现,鼓吹了瀑布流形式的页面展示方式,所以不得不了解了解这种新的分页方式. 官网上有对infinite-scroll的详细描述,但一 ... 
- AngularJS 无限滚动加载数据控件 ngInfiniteScroll
		在开发中我们可能会遇到滚动鼠标到浏览器底部实现数据的加载,js和jquery实现都不复杂都是既然AngularJS提供现成的我们怎么不用昵. ng-infinite-scroll.js这个组件则可以实 ... 
随机推荐
- ES 15 - Elasticsearch中的数据类型 (text、keyword、date、geo等)
			目录 1 核心数据类型 1.1 字符串类型 - string(不再支持) 1.1.1 文本类型 - text 1.1.2 关键字类型 - keyword 1.2 数字类型 - 8种 1.3 日期类型 ... 
- 《HelloGitHub》第 33 期
			公告 欢迎 点击分享 自荐或发现的开源项目,也可安装 分享插件 更便捷地推荐有趣的开源项目. 小伙伴们,新的一年就要来了,今年的 Bug 改完了吗?先看看<HelloGitHub>最新一期 ... 
- Hive使用必知必会系列
			一.Hive的几种数据模型 内部表 (Table 将数据保存到Hive 自己的数据仓库目录中:/usr/hive/warehouse) 外部表 (External Table 相对于内部表,数据不在自 ... 
- Scrapy爬取Ajax(异步加载)网页实例——简书付费连载
			这两天学习了Scrapy爬虫框架的基本使用,练习的例子爬取的都是传统的直接加载完网页的内容,就想试试爬取用Ajax技术加载的网页. 这里以简书里的优选连载网页为例分享一下我的爬取过程. 网址为: ht ... 
- pfSense配置基于时间的防火墙规则
			基于时间的规则允许防火墙规则在指定的日期和/或时间范围内激活.基于时间的规则与任何其他规则的功能相同,只是它们在预定时间之外的规则集中实际上不存在. 基于时间的规则逻辑处理基于时间的规则时,调度计划确 ... 
- 如何通过免费开源的ERP Odoo打造企业全员营销整体解决方案
			应用场景的背景故事 在一些二级城市,往往线索的来源是通过企业当地口碑积累.熟人转介绍等线下的方式为主,利用互联网的模式往往很难奏效,企业面临的第一个问题就是如何把握线索真实的来源介绍的问题.在这个问题 ... 
- Windows Server 2016-OU组织单位日常操作
			技术无所谓贵贱,既然曾经做过就总该是要留下点什么,毕竟做技术这些年给我们留下太多太多的成长经历,总有人问这些已经很皮毛了为什么还要写,其实没那么多花哨理由,就是想着做或者不做这一块总是要对过往做个简单 ... 
- 20170319 - pycurl 提示 libcurl link-time version is older than compile-time version
			使用 conda update anaconda 升级后,运行程序得到如下提示: ImportError: pycurl: libcurl link-time version (7.45.0) is ... 
- 关于加载font-awesome文字显示不出来
			关于font-awesome的网站 中文网:http://www.fontawesome.com.cn/get-started/ 官网:https://fontawesome.com/ 中文网4.7: ... 
- 机器学习 ML.NET 发布 1.0 RC
			ML.NET 是面向.NET开发人员的开源和跨平台机器学习框架(Windows,Linux,macOS),通过使用ML.NET,.NET开发人员可以利用他们现有的工具和技能组,为情感分析,推荐,图像分 ... 
