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 相关文章推荐
Javascript中正则表达式的全局匹配模式分析
Apr 26 Javascript
基于jquery自己写tab滑动门(通用版)
Oct 30 Javascript
js中return false(阻止)的用法
Aug 14 Javascript
javascript实现完美拖拽效果
May 06 Javascript
探究Vue.js 2.0新增的虚拟DOM
Oct 20 Javascript
vue.js实现用户评论、登录、注册、及修改信息功能
May 30 Javascript
React Native之ListView实现九宫格效果的示例
Aug 02 Javascript
JS库之Three.js 简易入门教程(详解之一)
Sep 13 Javascript
mui框架移动开发初体验详解
Oct 11 Javascript
JS使用贪心算法解决找零问题示例
Nov 27 Javascript
Es6 Generator函数详细解析
Feb 24 Javascript
Angular4学习笔记router的简单使用
Mar 30 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
PHP数组操作汇总 php数组的使用技巧
2011/07/17 PHP
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
2017/08/01 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
2020/04/04 PHP
InnerHtml和InnerText的区别分析
2009/03/13 Javascript
input 输入框内的输入事件详细分析
2010/03/17 Javascript
jquery keypress,keyup,onpropertychange键盘事件
2010/06/25 Javascript
使用Json比用string返回数据更友好,也更面向对象一些
2011/09/13 Javascript
用js实现控件的隐藏及style.visibility的使用
2013/06/14 Javascript
jquery获取对象的方法足以应付常见的各种类型的对象
2014/05/14 Javascript
BootStrap使用popover插件实现鼠标经过显示并保持显示框
2016/06/23 Javascript
Jquery组件easyUi实现手风琴(折叠面板)示例
2016/08/23 Javascript
JS 动态加载js文件和css文件 同步/异步的两种简单方式
2016/09/23 Javascript
基于Vuejs框架实现翻页组件
2020/06/29 Javascript
js实现自定义路由
2017/02/04 Javascript
jQuery实现列表的增加和删除功能
2018/06/14 jQuery
Layui表格行工具事件与数据回填方法
2019/09/13 Javascript
JavaScript实现简单动态表格
2020/12/02 Javascript
Python爬虫之模拟知乎登录的方法教程
2017/05/25 Python
Python基于pygame模块播放MP3的方法示例
2017/09/30 Python
python实现外卖信息管理系统
2018/01/11 Python
Python使用Paramiko控制liunx第三方库
2020/05/20 Python
python进度条显示之tqmd模块
2020/08/22 Python
sqlalchemy实现时间列自动更新教程
2020/09/02 Python
浅析Python requests 模块
2020/10/09 Python
pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)
2020/12/16 Python
python 基于pygame实现俄罗斯方块
2021/03/02 Python
HTML5自定义属性的问题分析
2019/08/16 HTML / CSS
Html5 video标签视频的最佳实践
2020/02/26 HTML / CSS
Dillard’s百货官网:Dillards.com
2018/05/26 全球购物
美国地毯购买网站:Rugs USA
2019/02/23 全球购物
英国银首饰公司:e&e Jewellery
2021/02/11 全球购物
大学本科毕业生求职简历的自我评价
2013/10/09 职场文书
大学班级干部的自我评价分享
2014/02/10 职场文书
预备党员承诺书
2014/03/25 职场文书
生日宴会祝酒词
2015/08/10 职场文书
MySQL 数据 data 基本操作
2022/05/04 MySQL