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 相关文章推荐
匹配任意字符的正则表达式写法
Apr 29 Javascript
在网站上应该用的30个jQuery插件整理
Nov 03 Javascript
Javascript的常规数组和关联数组对比小结
May 24 Javascript
Jquery插件仿百度搜索关键字自动匹配功能
May 11 Javascript
jq给页面添加覆盖层遮罩的实例
Feb 16 Javascript
浅析为什么a=&quot;abc&quot; 不等于 a=new String(&quot;abc&quot;)
Oct 25 Javascript
VueJs 将接口用webpack代理到本地的方法
Nov 27 Javascript
详解如何在vue项目中引入elementUI组件
Feb 11 Javascript
基于mpvue的小程序项目搭建的步骤
May 22 Javascript
微信小程序实现单选选项卡切换效果
Jun 19 Javascript
Vue 引入AMap高德地图的实现代码
Apr 29 Javascript
vue 返回上一页,页面样式错乱的解决
Nov 14 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
thinkphp验证码显示不出来的解决方法
2014/03/29 PHP
smarty简单分页的实现方法
2014/10/27 PHP
微信公众平台之快递查询功能用法实例
2015/04/14 PHP
PHP aes (ecb)解密后乱码问题
2015/06/22 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
2015/12/31 PHP
基于jquery.Jcrop的头像编辑器
2010/03/01 Javascript
js下判断 iframe 是否加载完成的完美方法
2010/10/26 Javascript
判断用户是否在线的代码
2011/03/05 Javascript
在Linux上用forever实现Node.js项目自启动
2014/07/09 Javascript
浅谈JavaScript函数节流
2014/12/09 Javascript
node.js操作mysql(增删改查)
2015/07/24 Javascript
javascript实现禁止复制网页内容汇总
2015/12/30 Javascript
js用类封装pop弹窗组件
2017/10/08 Javascript
微信小程序支付功能 php后台对接完整代码分享
2018/06/12 Javascript
vue和webpack安装命令详解
2018/06/15 Javascript
解决layui富文本编辑器图片上传无法回显的问题
2019/09/18 Javascript
es6 for循环中let和var区别详解
2020/01/12 Javascript
python 从csv读数据到mysql的实例
2018/06/21 Python
python抓取需要扫微信登陆页面
2019/04/29 Python
Python实用工具FuckIt.py介绍
2019/07/02 Python
Python中print函数简单使用总结
2019/08/05 Python
python pillow模块使用方法详解
2019/08/30 Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
2019/10/11 Python
python文件读取失败怎么处理
2020/06/23 Python
使用CSS3来代替JS实现交互
2017/08/10 HTML / CSS
localStorage 设置过期时间的方法实现
2018/12/21 HTML / CSS
加拿大女鞋品牌:ALDO
2016/11/13 全球购物
瑜伽灵感珠宝:Satya Jewelry
2018/01/06 全球购物
亿企通软件测试面试题
2012/04/10 面试题
UNIX命令速查表
2012/03/10 面试题
年终考核评语
2014/01/19 职场文书
《我不是最弱小的》教学反思
2014/02/23 职场文书
2015年公路养护工作总结
2015/05/13 职场文书
MySQL中VARCHAR与CHAR格式数据的区别
2021/05/26 MySQL
还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)
2021/06/07 Python
SpringBoot2零基础到精通之数据库专项精讲
2022/03/22 Java/Android