Vue实现一个无限加载列表功能


Posted in Javascript onNovember 13, 2018

一个需要判断的地方就是加载中再次触发滚动的时候,不要获取数据。

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>列表无限加载</title>
 <style>
  * {
   margin: 0;
   padding: 0;
  }
  li {
   height: 50px;
   border-bottom: 1px solid #c7c7c7;
   list-style: none;
   line-height: 50px;
   padding-left: 30px;
  }
 </style>
</head>
<body>
 <div id="unlimitedList">
  <ul>
   <li v-for="item in list">{{ item }}</li>
   <li :style="{display: loading ? 'initial' : 'none'}">Loading......</div>
  </ul>
 </div>
 <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
 <script>
  function fetch(from, size = 20) { // 模拟后台获取数据
   console.log('获取数据 传入: ', { from, size });
   let data = [];
   let total = 98;
   size = Math.min(size, total - from + 1);
   for (let i = 0; i < size; i++) {
    data.push(`列表项${from + i}`);
   }
   let ret = { data, total };
   return new Promise(function (resolve, reject) {
    setTimeout(() => {
     console.log('获取数据 返回: ', ret);
     resolve(ret);
    }, 500);
   })
  }
  new Vue({
   el: '#unlimitedList',
   data: {
    list: [],
    loading: true,  // 数据加载中
    allLoaded: false // 数据已经全部加载
   },
   methods: {
    getData() {
     this.loading = true; // 显示加载中的标识
     fetch(this.list.length + 1).then(res => {
      this.list.splice(this.list.length, 0, ...res.data); // 将新获取到的数据连接到 this.list (vue 能检测到 splice() 函数
      this.loading = false; // 加载结束 取消加载中显示
      if (this.list.length === res.total) {
       this.allLoaded = true;
      }
     })
    },
    onScroll(e) {
     if (this.loading || this.allLoaded) return;
     let top = document.documentElement.scrollTop || document.body.scrollTop; // 滚动条在Y轴上的滚动距离
     let vh = document.compatMode == 'CSS1Compat' ? document.documentElement.clientHeight : document.body.clientHeight; // 浏览器视口的高度
     let height = Math.max(document.body.scrollHeight, document.documentElement.scrollHeight); // 文档的总高度
     if (top + vh >= height) { // 滚动到底部
      this.getData(); // 如果已经滚到底了 获取数据
     }
    }
   },
   created() {
    this.getData();
    window.addEventListener('scroll', this.onScroll);
   },
   destroyed () {
    window.removeEventListener('scroll', this.onScroll);
   }
  })
 </script>
</body>
</html>

总结

以上所述是小编给大家介绍的Vue实现一个无限加载列表功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
指定js可访问其它域名的cookie的方法
Sep 18 Javascript
一些实用的jQuery代码片段收集
Jul 12 Javascript
js中如何复制一个对象并获取其所有属性和属性对应的值
Oct 24 Javascript
jquery实现动态菜单的实例代码
Nov 28 Javascript
Javascript 修改String 对象 增加去除空格功能(示例代码)
Nov 30 Javascript
JavaScript中常见的字符串操作函数及用法汇总
May 04 Javascript
jQuery对JSON数据进行排序输出的方法
Jun 24 Javascript
Jquery修改image的src属性,图片不加载问题的解决方法
May 17 Javascript
9个让JavaScript调试更简单的Console命令
Nov 14 Javascript
angular 数据绑定之[]和{{}}的区别
Sep 25 Javascript
解决vue-cli webpack打包开启Gzip 报错问题
Jul 24 Javascript
js获取 gif 的帧数的代码实例
Sep 10 Javascript
Vue实现移动端页面切换效果【推荐】
Nov 13 #Javascript
vue中slot(插槽)的介绍与使用
Nov 12 #Javascript
vuex的module模块用法示例
Nov 12 #Javascript
React手稿之 React-Saga的详解
Nov 12 #Javascript
基于游标的分页接口实现代码示例
Nov 12 #Javascript
React Hooks的深入理解与使用
Nov 12 #Javascript
详解如何解决vue开发请求数据跨域的问题(基于浏览器的配置解决)
Nov 12 #Javascript
You might like
推荐25款php中非常有用的类库
2014/09/29 PHP
一个经典实用的PHP图像处理类分享
2014/11/18 PHP
基于Jquery的将DropDownlist的选中值赋给label的实现代码
2011/05/06 Javascript
精通Javascript系列之数值计算
2011/06/07 Javascript
JQuery实现用户名无刷新验证的小例子
2013/03/22 Javascript
JS保存和删除cookie操作 判断cookie是否存在
2013/11/13 Javascript
jQuery+html5实现div弹出层并遮罩背景
2015/04/15 Javascript
Bootstrap实现弹性搜索框
2016/07/11 Javascript
微信小程序 video详解及简单实例
2017/01/16 Javascript
vue实现点击图片放大效果
2017/08/15 Javascript
Node.js实现发送邮件功能
2017/11/06 Javascript
node.js支持多用户web终端实现及安全方案
2017/11/29 Javascript
vue+element-ui实现表格编辑的三种实现方式
2018/10/31 Javascript
Vue.js结合bootstrap前端实现分页和排序效果
2018/12/29 Javascript
[03:46]显微镜下的DOTA2第七期——满血与残血
2014/06/20 DOTA
python解析json实例方法
2013/11/19 Python
CentOS 6.X系统下升级Python2.6到Python2.7 的方法
2016/10/12 Python
Windows下安装python2和python3多版本教程
2017/03/30 Python
Django实现快速分页的方法实例
2017/10/22 Python
Python实现的读取/更改/写入xml文件操作示例
2018/08/30 Python
windows7 32、64位下python爬虫框架scrapy环境的搭建方法
2018/11/29 Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
2019/01/05 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
2019/06/19 Python
Python 实现敏感目录扫描的示例代码
2020/05/21 Python
小天鹅官方商城:LittleSwan
2017/06/16 全球购物
英国最大的美妆产品在线零售商之一:Beauty Bay
2017/09/29 全球购物
美国木工工具和用品商店:Woodcraft
2019/10/30 全球购物
SNIDEL官网:日本VIVI杂志人气少女第一品牌
2020/03/12 全球购物
销售工作人员的自我评价分享
2013/11/10 职场文书
财会自我鉴定范文
2013/12/27 职场文书
清扬洗发水广告词
2014/03/14 职场文书
纪检干部先进事迹材料
2014/08/23 职场文书
一波干货,会议主持词开场白范文
2019/05/06 职场文书
如何书写先进事迹材料?
2019/07/02 职场文书
MySql 8.0及对应驱动包匹配的注意点说明
2021/06/23 MySQL
浅谈Python中对象是如何被调用的
2022/04/06 Python