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 相关文章推荐
一些易混淆且不常用的属性,希望有用
Jan 29 Javascript
Javascript中eval函数的使用方法与示例
Apr 09 Javascript
跟着JQuery API学Jquery 之三 筛选
Apr 09 Javascript
基于jquery实现状态限定编辑的代码
Feb 11 Javascript
浏览器加载、渲染和解析过程黑箱简析
Nov 29 Javascript
JavaScript阻止事件冒泡示例分享
Dec 28 Javascript
jQuery+css3动画属性制作猎豹浏览器宽屏banner焦点图
Mar 16 Javascript
基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作
May 12 Javascript
使用use注册Vue全局组件和全局指令的方法
Mar 08 Javascript
JS动画定时器知识总结
Mar 23 Javascript
Vue页面骨架屏注入方法
May 13 Javascript
layUI使用layer.open,在content打开数据表格,获取值并返回的方法
Sep 26 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
Syphon 秘笈
2021/03/03 冲泡冲煮
php中函数的形参与实参的问题说明
2010/09/01 PHP
php定时执行任务设置详解
2015/02/06 PHP
PHP编写文件多服务器同步程序
2016/07/02 PHP
PHP使用preg_split和explode分割textarea存放内容的方法分析
2017/07/03 PHP
textarea中的手动换行处理的jquery代码
2011/02/26 Javascript
JS关键字球状旋转效果的实例代码
2013/11/29 Javascript
一段非常简单的js判断浏览器的内核
2014/08/17 Javascript
javascript实现checkbox全选的代码
2015/04/30 Javascript
解决jQuery使用JSONP时产生的错误
2015/12/02 Javascript
Node.js环境下JavaScript实现单链表与双链表结构
2016/06/12 Javascript
前端程序员必须知道的高性能Javascript知识
2016/08/24 Javascript
node.js文件上传处理示例
2016/10/27 Javascript
浅析JavaScript动画模拟拖拽原理
2016/12/09 Javascript
微信小程序 网络请求(post请求,get请求)
2017/01/17 Javascript
Angular实现响应式表单
2017/08/04 Javascript
对VUE中的对象添加属性
2018/09/18 Javascript
Vue框架TypeScript装饰器使用指南小结
2019/02/18 Javascript
React中阻止事件冒泡的问题详析
2019/04/12 Javascript
Python二分法搜索算法实例分析
2015/05/11 Python
Python list操作用法总结
2015/11/10 Python
实例讲解Python中global语句下全局变量的值的修改
2016/06/16 Python
python中pylint使用方法(pylint代码检查)
2018/04/06 Python
python操作redis方法总结
2018/06/06 Python
python自动化unittest yaml使用过程解析
2020/02/03 Python
详解Python 中的 defaultdict 数据类型
2021/02/22 Python
HTML5 Canvas draw方法制作动画效果示例
2013/07/11 HTML / CSS
说一下Linux下有关用户和组管理的命令
2014/08/18 面试题
大学生职业生涯规划书模板
2014/01/03 职场文书
可贵的沉默教学反思
2014/02/06 职场文书
作风整顿剖析材料
2014/09/30 职场文书
2014年房地产工作总结范文
2014/11/19 职场文书
简单的辞职信怎么写
2015/02/28 职场文书
未中标通知书
2015/04/17 职场文书
2016年党员读书月活动总结
2016/04/06 职场文书
在JavaScript中如何使用宏详解
2021/05/06 Javascript