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 相关文章推荐
用javascript实现页面打印的三种方法
Mar 05 Javascript
谈谈关于JavaScript 中的 MVC 模式
Apr 11 Javascript
原生Js页面滚动延迟加载图片实现原理及过程
Jun 24 Javascript
Jquery实现网页跳转或用命令打开指定网页的解决方法
Jul 09 Javascript
网页右侧悬浮滚动在线qq客服代码示例
Apr 28 Javascript
JQuery中层次选择器用法实例详解
May 18 Javascript
js带缩略图的图片轮播效果代码分享
Sep 14 Javascript
jquery判断密码强度的验证代码
Apr 22 Javascript
Angular的Bootstrap(引导)和Compiler(编译)机制
Jun 20 Javascript
vue.js图片转Base64上传图片并预览的实现方法
Aug 02 Javascript
小程序实现自定义导航栏适配完美版
Apr 02 Javascript
在vue中利用全局路由钩子给url统一添加公共参数的例子
Nov 01 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
php+mysql实现无限级分类 | 树型显示分类关系
2006/11/19 PHP
如何用phpmyadmin设置mysql数据库用户的权限
2012/01/09 PHP
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
2014/12/18 PHP
PHP三种方式实现链式操作详解
2017/01/21 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
jquery $.ajax入门应用一
2008/11/19 Javascript
Mootools 1.2教程 排序类和方法简介
2009/09/15 Javascript
网页中的图片的处理方法与代码
2009/11/26 Javascript
7个JS基础知识总结
2014/03/05 Javascript
setinterval()与clearInterval()JS函数的调用方法
2015/01/21 Javascript
javascript动态创建链接的方法
2015/05/13 Javascript
在Node.js应用中使用Redis的方法简介
2015/06/24 Javascript
JavaScript操作class和style样式代码详解
2016/02/13 Javascript
简单的JS控制button颜色随点击更改的实现方法
2017/04/17 Javascript
Angularjs在360兼容模式下取数据缓存问题的解决办法
2017/06/22 Javascript
详解vue + vuex + directives实现权限按钮的思路
2017/10/24 Javascript
anime.js 实现带有描边动画效果的复选框(推荐)
2017/12/24 Javascript
Vuex中的State使用介绍
2019/01/19 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
2019/05/18 Javascript
带你使用webpack快速构建web项目的方法
2020/11/12 Javascript
antdesign-vue结合sortablejs实现两个table相互拖拽排序功能
2021/01/08 Vue.js
初步介绍Python中的pydoc模块和distutils模块
2015/04/13 Python
Python将DataFrame的某一列作为index的方法
2018/04/08 Python
Python堆排序原理与实现方法详解
2018/05/11 Python
Python面向对象程序设计类的多态用法详解
2019/04/12 Python
opencv转换颜色空间更改图片背景
2019/08/20 Python
用python中的matplotlib绘制方程图像代码
2019/11/21 Python
法国大使拉杆箱官网:DELSEY Paris
2018/03/20 全球购物
机电专业个人自荐信格式模板
2013/09/23 职场文书
物业管理求职自荐信
2013/09/25 职场文书
毕业生个人的自我评价优秀范文
2013/10/03 职场文书
策划主管的工作职责
2013/11/24 职场文书
代理商会议邀请函
2014/01/27 职场文书
安全生产标语大全
2014/10/06 职场文书
涉及车辆房产分割的离婚协议书范文
2014/10/12 职场文书
房屋质量投诉书
2015/07/02 职场文书