Vue下滚动到页面底部无限加载数据的示例代码


Posted in Javascript onApril 22, 2018

看到一篇Implementing an Infinite Scroll with Vue.js , 觉得挺实用的就看了下, 顺便简单翻译了一下给需要的人参考.

从这个项目中可以加深对Vue的生命周期的理解, 何时开始axios请求, 如何结合Vue使用原生js来写scroll事件等等, 我这里主要是对原文的重点提取和补充

本文技术要点

  1. Vue生命周期
  2. axios简单用法
  3. moment.js格式化日期
  4. 图片懒加载
  5. 结合原生js来写scroll事件
  6. 请求节流

创建项目

首先创建一个简单的vue项目

# vue init webpack-simple infinite-scroll-vuejs

然后安装项目所需要用的一些插件

# npm install axios moment

初始化用户数据

项目搭建完后, 跑起来看看

# npm run dev

打开http://localhost:8080无误后, 我们开始修改代码, 先看看获取用户数据这块,

<script>
import axios from 'axios'
import moment from 'moment'
export default {
 name: 'app',
 // 创建一个存放用户数据的数组
 data() {
  return {
   persons: []
  }
 },
 methods: {
  // axios请求接口获取数据
  getInitialUsers() {
   for (var i = 0; i < 5; i++) {
    axios.get(`https://randomuser.me/api/`).then(response => {
     this.persons.push(response.data.results[0])
    })
   }
  },
  formatDate(date) {
   if (date) {
    return moment(String(date)).format('MM/DD/YYYY')
   }
  },
 beforeMount() {
  // 在页面挂载前就发起请求
  this.getInitialUsers()
 }
}
</script>

这里原作者也专门提醒, 完全没有必要也不建议在加载页面的时候请求5次, 只是这个接口一次只能返回1条数据, 仅用于测试才这样做的. 当然我这里也可以通过Mock来模拟数据, 就不详细说了~

接下来来写模板结构和样式, 如下:

<template>
 <div id="app">
  <h1>Random User</h1>
  <div class="person" v-for="(person, index) in persons" :key="index">
   <div class="left">
    <img :src="person.picture.large" alt="">
   </div>
   <div class="right">
    <p>{{ person.name.first}} {{ person.name.last }}</p>
    <ul>
     <li>
      <strong>Birthday:</strong> {{ formatDate(person.dob)}}
     </li>
     <div class="text-capitalize">
      <strong>Location:</strong> {{ person.location.city}}, {{ person.location.state }}
     </div>
    </ul>
   </div>
  </div>
 </div>
</template>

<style lang="scss">
.person {
 background: #ccc;
 border-radius: 2px;
 width: 20%;
 margin: 0 auto 15px auto;
 padding: 15px;

 img {
  width: 100%;
  height: auto;
  border-radius: 2px;
 }

 p:first-child {
  text-transform: capitalize;
  font-size: 2rem;
  font-weight: 900;
 }

 .text-capitalize {
  text-transform: capitalize;
 }
}
</style>

这样页面就能显示5个人的个人信息了.

处理无限滚动加载逻辑

我们接下来需要在methods里面添加scroll()来监听滚动, 并且这个事件是应该在mounted()这个生命周期内的. 代码如下:

<script>
 // ...
 methods: {
  // ...
  scroll(person) {
   let isLoading = false
   window.onscroll = () => {
    // 距离底部200px时加载一次
    let bottomOfWindow = document.documentElement.offsetHeight - document.documentElement.scrollTop - window.innerHeight <= 200
    if (bottomOfWindow && isLoading == false) {
     isLoading = true
     axios.get(`https://randomuser.me/api/`).then(response => {
      person.push(response.data.results[0])
      isLoading = false
     })
    }
   }
  }
 },
 mounted() {
  this.scroll(this.persons)
 }
}
</script>

这段代码原文是有一点拼写错误的. 我这里修正了, 另外增加了距离底部即开始加载数据, 并进行截流.

保存好, 回到浏览器, 查看效果, 已经没有问题了~

总结

滚动到页面底部无限加载的功能在Vue上实现其实和普通的页面开发差不多, 每次滚动加载未完成的情况下不会触发请求下一次, 每次请求push到数组内, 通过<img :src="">的数据绑定实现了懒加载(其实0 0我不太认可...), 看完是不是感觉挺简单的.

最后, 我把这个也弄了一份在GitHub上面, 有需要的可以看看infinite-scroll-vuejs-demo~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 树控件 比较好用
Jun 11 Javascript
登陆成功后自动计算秒数执行跳转
Jan 23 Javascript
jQuery中DOM树操作之使用反向插入方法实例分析
Jan 23 Javascript
webpack学习笔记之代码分割和按需加载的实例详解
Jul 20 Javascript
JS判断用户用的哪个浏览器实例详解
Oct 09 Javascript
Vue内部渲染视图的方法
Sep 02 Javascript
vue data恢复初始化数据的实现方法
Oct 31 Javascript
JS数组属性去重并校验重复数据
Jan 10 Javascript
vue-router为激活的路由设置样式操作
Jul 18 Javascript
ant-design-vue中tree增删改的操作方法
Nov 03 Javascript
jquery插件实现悬浮的菜单
Apr 24 jQuery
使用Ajax实现进度条的绘制
Apr 07 Javascript
关于Angularjs中自定义指令一些有价值的细节和技巧小结
Apr 22 #Javascript
jQuery中图片展示插件highslide.js的简单dom
Apr 22 #jQuery
手写简单的jQuery雪花飘落效果实例
Apr 22 #jQuery
JQuery元素快速查找与操作
Apr 22 #jQuery
javaScript产生随机数的用法小结
Apr 21 #Javascript
JS弹窗 JS弹出DIV并使整个页面背景变暗功能的实现代码
Apr 21 #Javascript
JavaScript调用模式与this关键字绑定的关系
Apr 21 #Javascript
You might like
php 在线打包_支持子目录
2008/06/28 PHP
“不能执行已释放的Script代码”错误的原因及解决办法
2007/09/09 Javascript
用dtree实现树形菜单 dtree使用说明
2011/10/17 Javascript
常见JS效果之图片减速度滚动实现代码
2011/12/08 Javascript
JQuery中根据属性或属性值获得元素(6种情况获取方法)
2013/01/17 Javascript
jQuery查询数据返回object和字符串影响原因是什么
2013/08/09 Javascript
jquery 倒计时效果实现秒杀思路
2013/09/11 Javascript
window.open()详解及浏览器兼容性问题示例探讨
2014/05/29 Javascript
jQuery点缩略图弹出层显示大图片
2015/02/13 Javascript
详解参数传递四种形式
2015/07/21 Javascript
JS中的数组方法笔记整理
2016/07/26 Javascript
vue中appear的用法
2017/08/17 Javascript
jQuery实现base64前台加密解密功能详解
2017/08/29 jQuery
在一个页面实现两个zTree联动的方法
2017/12/20 Javascript
JavaScript ES6箭头函数使用指南
2018/12/30 Javascript
nodejs+koa2 实现模仿springMVC框架
2020/10/21 NodeJs
python 文件和路径操作函数小结
2009/11/23 Python
python中WSGI是什么,Python应用WSGI详解
2017/11/24 Python
用Django实现一个可运行的区块链应用
2018/03/08 Python
python3.6.3安装图文教程 TensorFlow安装配置方法
2020/06/24 Python
python3+django2开发一个简单的人员管理系统过程详解
2019/07/23 Python
使用PyQt5实现图片查看器的示例代码
2020/04/21 Python
python openpyxl模块的使用详解
2021/02/25 Python
canvas 绘图时位置偏离的问题解决
2020/09/16 HTML / CSS
荷兰电脑专场:Paradigit
2018/05/05 全球购物
法学专业毕业生自荐信范文
2013/12/18 职场文书
有关打架的检讨书
2014/01/25 职场文书
总会计师岗位职责
2014/02/19 职场文书
梅花魂教学反思
2014/04/25 职场文书
学校欢迎标语
2014/06/18 职场文书
委托代理人授权委托书范本
2014/09/24 职场文书
电气工程师岗位职责
2015/02/12 职场文书
企业计划生育责任书
2015/05/09 职场文书
致三级跳运动员加油稿
2015/07/21 职场文书
建筑工程挂靠协议书
2016/03/23 职场文书
spring boot实现文件上传
2022/08/14 Java/Android