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 相关文章推荐
js字符编码函数区别分析
Jun 05 Javascript
JavaScript中最简洁的编码html字符串的方法
Oct 11 Javascript
基于zepto.js实现仿手机QQ空间的大图查看组件ImageView.js详解
Mar 05 Javascript
JS基于cookie实现来宾统计记录访客信息的方法
Aug 04 Javascript
Jquery 自定义事件实现发布/订阅的简单实例
Jun 12 Javascript
微信端开发--登录小程序步骤
Jan 11 Javascript
Angular2实现自定义双向绑定属性
Mar 22 Javascript
node.js操作mongodb简单示例分享
May 25 Javascript
用JS编写一个函数,返回数组中重复出现过的元素(实例)
Sep 14 Javascript
swiper移动端轮播插件(触碰图片之后停止轮播)
Dec 28 Javascript
Javascript实现时间倒计时功能
Nov 17 Javascript
js实现鼠标点击页面弹出自定义文字效果
Dec 24 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
echo, print, printf 和 sprintf 区别
2006/12/06 PHP
php curl 登录163邮箱并抓取邮箱好友列表的代码(经测试)
2011/04/07 PHP
php使用parse_url和parse_str解析URL
2015/02/22 PHP
在Linux系统的服务器上隐藏PHP版本号的方法
2015/06/06 PHP
PHP文件缓存类实现代码
2015/10/26 PHP
解决laravel 出现ajax请求419(unknown status)的问题
2019/09/03 PHP
javascript 播放器 控制
2007/01/22 Javascript
Jquery进度条插件 Progress Bar小问题解决
2011/07/12 Javascript
JS在textarea光标处插入文本的小例子
2013/03/22 Javascript
IE下JS读取xml文件示例代码
2013/08/05 Javascript
js的alert弹出框出现乱码解决方案
2013/09/02 Javascript
将两个div左右并列显示并实现点击标题切换内容
2013/10/22 Javascript
javascript判断office版本示例
2014/04/11 Javascript
超级好用的jQuery圆角插件 Corner速成
2014/08/31 Javascript
JS锚点的设置与使用方法
2016/09/05 Javascript
IOS中safari下的select下拉菜单文字过长不换行的解决方法
2016/09/26 Javascript
Vue 2.0 服务端渲染入门介绍
2017/03/29 Javascript
Vue filter介绍及其使用详解
2017/10/21 Javascript
Vue v2.5 调整和更新不完全问题
2017/10/24 Javascript
vue控制多行文字展开收起的实现示例
2019/10/11 Javascript
Vue使用Proxy代理后仍无法生效的解决
2020/11/13 Javascript
python海龟绘图实例教程
2014/07/24 Python
python利用re,bs4,requests模块获取股票数据
2019/07/29 Python
关于sys.stdout和print的区别详解
2019/12/05 Python
简单几步用纯CSS3实现3D翻转效果
2019/01/17 HTML / CSS
canvas烟花特效锦集
2018/01/17 HTML / CSS
使用useBean标志初始化BEAN时如何接受初始化参数
2012/02/11 面试题
幼儿教师个人求职信范文
2013/09/21 职场文书
大学生两会学习心得体会
2014/03/10 职场文书
“四风”问题整改措施和努力方向
2014/09/20 职场文书
离婚协议书范文2014(夫妻感情破裂)
2014/12/14 职场文书
售后前台接待岗位职责
2015/04/03 职场文书
医疗纠纷调解协议书
2015/08/06 职场文书
2019新学期家长会工作计划
2019/08/21 职场文书
导游词之青岛太清宫
2019/12/13 职场文书
Golang map映射的用法
2022/04/22 Golang