Vue 无限滚动加载指令实现方法


Posted in Javascript onMay 28, 2019

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

计算公式提简单的   底部等于(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 无限滚动加载指令实现方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
jquery自动完成插件(autocomplete)应用之PHP版
Dec 15 Javascript
javaScript call 函数的用法说明
Apr 09 Javascript
基于jquery点击自以外任意处,关闭自身的代码
Feb 10 Javascript
jquery text(),val(),html()方法区别总结
Nov 04 Javascript
基于jQuery实现点击弹出层实例代码
Jan 01 Javascript
详解javascript实现自定义事件
Jan 19 Javascript
JS异步文件分片断点上传的实现思路
Dec 25 Javascript
JS 组件系列之 bootstrap treegrid 组件封装过程
Apr 28 Javascript
小发现之浅谈location.search与location.hash的问题
Jun 23 Javascript
webpack开发跨域问题解决办法
Aug 03 Javascript
JS设计模式之观察者模式实现实时改变页面中金额数的方法
Feb 05 Javascript
JavaScript生成指定范围的时间列表
Mar 19 Javascript
vue实现搜索过滤效果
May 28 #Javascript
微信小程序 image组件遇到的问题
May 28 #Javascript
vue实现搜索功能
May 28 #Javascript
Bootstrap 时间日历插件bootstrap-datetimepicker配置与应用小结
May 28 #Javascript
如何实现双向绑定mvvm的原理实现
May 28 #Javascript
vue实现带复选框的树形菜单
May 27 #Javascript
vue实现按需加载组件及异步组件功能
May 27 #Javascript
You might like
Re:从零开始的异世界生活 第2季 开播啦
2020/07/24 日漫
php实现的读取CSV文件函数示例
2017/02/07 PHP
关于PHP虚拟主机概念及如何选择稳定的PHP虚拟主机
2018/11/20 PHP
再谈querySelector和querySelectorAll的区别与联系
2012/04/20 Javascript
jQuery链式操作如何实现以及为什么要用链式操作
2013/01/17 Javascript
iframe父页面获取子页面参数的方法
2014/02/21 Javascript
jQuery中change事件用法实例
2014/12/26 Javascript
JavaScript中的函数嵌套使用
2015/06/04 Javascript
jQuery fancybox在ie浏览器下无法显示关闭按钮的解决办法
2016/02/19 Javascript
基于jquery实现简单的分页控件
2016/03/17 Javascript
js点击返回跳转到指定页面实现过程
2020/08/20 Javascript
在javascript中创建对象的各种模式解析
2016/05/16 Javascript
jQuery使用中可能被XSS攻击的一些危险环节提醒
2016/05/24 Javascript
微信小程序使用第三方库Underscore.js步骤详解
2016/09/27 Javascript
JS版微信6.0分享接口用法分析
2016/10/13 Javascript
怎样判断jQuery当前元素是隐藏还是显示
2016/11/23 Javascript
bootstrap timepicker在angular中取值并转化为时间戳
2017/06/13 Javascript
浅谈Angular2 ng-content 指令在组件中嵌入内容
2017/08/18 Javascript
vue-resouce设置请求头的三种方法
2017/09/12 Javascript
jquery实现烟花效果(面向对象)
2020/03/10 jQuery
Vue-cli3生成的Vue项目加载Mxgraph方法示例
2020/05/31 Javascript
在Vue中使用Echarts可视化库的完整步骤记录
2020/11/18 Vue.js
[01:11:15]VGJ.S vs Secret 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
numpy中loadtxt 的用法详解
2018/08/03 Python
Django Rest framework频率原理与限制
2019/07/26 Python
基于h5py的使用及数据封装代码
2019/12/26 Python
解析html5 canvas实现背景鼠标连线动态效果代码
2019/06/17 HTML / CSS
AmazeUI 面板的实现示例
2020/08/17 HTML / CSS
Lentiamo荷兰:在线订购隐形眼镜、隐形眼镜液和太阳镜
2019/10/25 全球购物
大专自我鉴定范文
2013/10/01 职场文书
毕业生实习鉴定
2013/12/11 职场文书
母婴店促销方案
2014/03/05 职场文书
作风转变年心得体会
2014/10/22 职场文书
2015年社区平安建设工作总结
2015/05/13 职场文书
2016年中秋节晚会领导致辞
2015/11/26 职场文书
学习社交礼仪心得体会
2016/01/22 职场文书