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做一个小游戏平台 (一)
Dec 29 Javascript
js的一些常用方法小结
Jun 29 Javascript
细说javascript函数从函数的构成开始
Aug 29 Javascript
JQuery操作iframe父页面与子页面的元素与方法(实例讲解)
Nov 20 Javascript
angularjs中的e2e测试实例
Dec 06 Javascript
使用OpenLayers3 添加地图鼠标右键菜单
Dec 29 Javascript
果断收藏9个Javascript代码高亮脚本
Jan 06 Javascript
vue.js中$watch的用法示例
Oct 04 Javascript
js实现悬浮窗效果(支持拖动)
Mar 09 Javascript
微信小程序页面传值实例分析
Apr 19 Javascript
vue 开发一个按钮组件的示例代码
Mar 27 Javascript
微信小程序页面调用自定义组件内的事件详解
Sep 12 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 UTF8 文件的签名问题
2009/10/30 PHP
php中获取关键词及所属来源搜索引擎名称的代码
2011/02/15 PHP
Centos下升级php5.2到php5.4全记录(编译安装)
2015/04/03 PHP
php生成静态html页面的方法(2种方法)
2015/09/14 PHP
PHP常用的三种设计模式汇总
2016/08/28 PHP
PHP多进程编程之僵尸进程问题的理解
2017/10/15 PHP
PHP XML Expat解析器知识点总结
2019/02/15 PHP
prototype 1.5相关知识及他人笔记
2006/12/16 Javascript
非常不错的功能强大代码简单的管理菜单美化版
2008/07/09 Javascript
jQuery lazyload 的重复加载错误以及修复方法
2010/11/19 Javascript
关于extjs4如何获取grid修改后的数据的问题
2013/08/07 Javascript
jQuery获得IE版本不准确webbrowser的解决方法
2014/02/23 Javascript
javascript中关于&amp;&amp; 和 || 表达式的小技巧分享
2015/04/10 Javascript
jquery使用each方法遍历json格式数据实例
2015/05/18 Javascript
jQuery实现ctrl+enter(回车)提交表单
2015/10/19 Javascript
SpringMVC返回json数据的三种方式
2015/12/10 Javascript
jQuery选择器实例应用
2017/01/05 Javascript
Node.js系列之安装配置与基本使用(1)
2019/08/30 Javascript
VUE解决 v-html不能触发点击事件的问题
2019/10/28 Javascript
Vue 中使用lodash对事件进行防抖和节流操作
2020/07/26 Javascript
python获得图片base64编码示例
2014/01/16 Python
python使用内存zipfile对象在内存中打包文件示例
2014/04/30 Python
Python中__name__的使用实例
2015/04/14 Python
深入解析Python中的__builtins__内建对象
2016/06/21 Python
Python 使用Numpy对矩阵进行转置的方法
2019/01/28 Python
python pexpect ssh 远程登录服务器的方法
2019/02/14 Python
Python参数类型以及常见的坑详解
2019/07/08 Python
Python如何使用bokeh包和geojson数据绘制地图
2020/03/21 Python
详解通过HTML5 Canvas实现图片的平移及旋转变化的方法
2016/03/22 HTML / CSS
H5离线存储Manifest原理及使用
2020/04/28 HTML / CSS
《月光启蒙》教学反思
2014/03/01 职场文书
投资协议书范本
2014/04/21 职场文书
个人租房协议书样本
2014/10/01 职场文书
《青山不老》教学反思
2016/02/22 职场文书
2019单位介绍信怎么写
2019/06/24 职场文书
mysql幻读详解实例以及解决办法
2022/06/16 MySQL