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的数字改变的动画效果--可用来做计数器
Aug 11 Javascript
jQuery的animate函数实现图文切换动画效果
May 03 Javascript
让微信小程序支持ES6中Promise特性的方法详解
Jun 13 Javascript
利用ES6实现单例模式及其应用详解
Dec 09 Javascript
p5.js 毕达哥拉斯树的实现代码
Mar 23 Javascript
React组件重构之嵌套+继承及高阶组件详解
Jul 19 Javascript
vue强制刷新组件的方法示例
Feb 28 Javascript
layui监听工具栏的实例(操作列表按钮)
Sep 10 Javascript
JavaScript实现简单的图片切换功能(实例代码)
Apr 10 Javascript
基于javascript的无缝滚动动画实现2
Aug 07 Javascript
Vue-cli打包后如何本地查看的操作
Sep 02 Javascript
微信小程序实现多张图片上传功能
Nov 18 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
3款值得推荐的微信开发开源框架
2014/10/28 PHP
Yii2创建控制器(createController)方法详解
2016/07/23 PHP
thinkphp框架page类与bootstrap分页(美化)
2017/06/25 PHP
二级域名转向类
2006/11/09 Javascript
Extjs Ajax 乱码问题解决方案
2009/04/15 Javascript
JavaScript中json对象和string对象之间相互转化
2012/12/26 Javascript
jQuery模拟超链接点击效果代码
2013/04/21 Javascript
关于extjs4如何获取grid修改后的数据的问题
2013/08/07 Javascript
jQuery实现下拉框左右选择的简单实例
2014/02/22 Javascript
JavaScript 对象深入学习总结(经典)
2015/09/29 Javascript
Bootstrap Validator 表单验证
2016/07/25 Javascript
js实现弹窗暗层效果
2017/01/16 Javascript
vue中Axios的封装与API接口的管理详解
2018/08/09 Javascript
Vue2 监听属性改变watch的实例代码
2018/08/27 Javascript
解决vue.js this.$router.push无效的问题
2018/09/03 Javascript
浅谈Vue页面级缓存解决方案feb-alive(上)
2019/04/14 Javascript
Vue实现简单的拖拽效果
2020/08/25 Javascript
[36:33]Ti4 循环赛第四日 附加赛NEWBEE vs Mouz
2014/07/13 DOTA
[01:07:57]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第二场 1月19日
2021/03/11 DOTA
Python脚本实现网卡流量监控
2015/02/14 Python
Python自动化构建工具scons使用入门笔记
2015/03/10 Python
Python中一些自然语言工具的使用的入门教程
2015/04/13 Python
Python入门学习之字符串与比较运算符
2015/10/12 Python
Python使用base64模块进行二进制数据编码详解
2018/01/11 Python
python实现黑客字幕雨效果
2018/06/21 Python
Python 把序列转换为元组的函数tuple方法
2019/06/27 Python
Python DES加密实现原理及实例解析
2020/07/17 Python
python3实现飞机大战
2020/11/29 Python
Python+unittest+DDT实现数据驱动测试
2020/11/30 Python
Fossil美国官网:Fossil手表、手袋、珠宝及配件
2017/02/01 全球购物
2014年保洁工作总结
2014/11/24 职场文书
2014年扶贫帮困工作总结
2014/12/09 职场文书
2015年上半年信访工作总结
2015/03/30 职场文书
MySQL 使用索引扫描进行排序
2021/06/20 MySQL
js 数组 fill() 填充方法
2021/11/02 Javascript
Redis 哨兵机制及配置实现
2022/03/25 Redis