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 相关文章推荐
jQuery中文入门指南,翻译加实例,jQuery的起点教程
Jan 13 Javascript
解决json日期格式问题的3种方法
Feb 02 Javascript
js 获取input点选按钮的值的方法
Apr 14 Javascript
基于javascript实现图片滑动效果
May 07 Javascript
使用bootstrap3开发响应式网站
May 12 Javascript
vue.js入门(3)——详解组件通信
Dec 02 Javascript
vue使用stompjs实现mqtt消息推送通知
Jun 22 Javascript
Vue自定义过滤器格式化数字三位加一逗号实现代码
Mar 23 Javascript
小程序图片长按识别功能的实现方法
Aug 30 Javascript
vue 解决移动端弹出键盘导致页面fixed布局错乱的问题
Nov 06 Javascript
如何在微信小程序中使用骨架屏的步骤
Jun 12 Javascript
VUE使用axios调用后台API接口的方法
Aug 03 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查询网站的PR值
2013/10/30 PHP
PHP 利用Mail_MimeDecode类提取邮件信息示例
2014/01/26 PHP
Laravel搭建后台登录系统步骤详解
2016/07/26 PHP
php遍历替换目录下文件指定内容的方法
2016/11/10 PHP
比较简单实用的使用正则三种版本的js去空格处理方法
2007/11/18 Javascript
javascript attachEvent和addEventListener使用方法
2009/03/19 Javascript
JavaScript中圆括号()和方括号[]的特殊用法疑问解答
2013/08/06 Javascript
java与javascript之间json格式数据互转介绍
2013/10/29 Javascript
删除条目时弹出的确认对话框
2014/06/05 Javascript
JavaScript AOP编程实例
2015/06/16 Javascript
基于javascript实现的购物商城商品倒计时实例
2016/12/11 Javascript
基于substring()和substr()的使用以及区别(实例讲解)
2017/12/28 Javascript
Vue 全家桶实现移动端酷狗音乐功能
2018/11/16 Javascript
微信小程序常用赋值方法小结
2019/04/30 Javascript
layui实现form表单同时提交数据和文件的代码
2019/10/25 Javascript
JS实现导航栏楼层特效
2020/01/01 Javascript
手把手教您实现react异步加载高阶组件
2020/04/07 Javascript
nodejs中内置模块fs,path常见的用法说明
2020/11/07 NodeJs
关于小程序优化的一些建议(小结)
2020/12/10 Javascript
快速实现基于Python的微信聊天机器人示例代码
2017/03/03 Python
python得到电脑的开机时间方法
2018/10/15 Python
Pytorch实现将模型的所有参数的梯度清0
2020/06/24 Python
The Kooples美国官方网站:为情侣提供的法国当代时尚品牌
2019/01/03 全球购物
Viking Direct荷兰:购买办公用品
2019/06/20 全球购物
牵手50香港:专为黄金岁月的单身人士而设的交友网站
2020/08/14 全球购物
机电一体化毕业生求职信
2013/11/02 职场文书
日语专业推荐信
2013/11/12 职场文书
报社实习生自荐信
2014/01/24 职场文书
医务工作者先进事迹材料
2014/01/26 职场文书
干部个人对照检查材料
2014/08/25 职场文书
2014年最新大专生职业生涯规划书范文
2014/09/13 职场文书
暑期辅导班宣传单
2015/07/14 职场文书
普希金诗歌赏析(6首)
2019/08/22 职场文书
Nginx快速入门教程
2021/03/31 Servers
springboot+WebMagic+MyBatis爬虫框架的使用
2021/08/07 Java/Android
分享3个非常实用的 Python 模块
2022/03/03 Python