LoadMore.vue
<template>
<div class="load-more-wrapper" @touchstart="touchStart($event)" @touchend="touchEnd($event)">
<div class="inner">
<slot></slot>
<div class="load-more" v-show="enableLoadMore">{{loadMoreText}}</div>
<div class="load-end" v-show="!enableLoadMore">已经到底了!</div>
</div>
</div>
</template>
<script>
export default {
name: "LoadMore",
props: {
enableLoadMore: {
type: Boolean,
default: true
},
onLoadMore: {
type: Function,
default: undefined,
require: false
}
},
data() {
return {
loadMoreText: "上拉加载更多",
startX: 0,
startY: 0,
isLoading: false,
}
},
methods: {
touchStart(e) {
this.startY = e.targetTouches[0].pageY;
this.startX = e.targetTouches[0].pageX;
},
scrollToEnd(e) {
let scrollHeight = this.$el.scrollHeight;
let clientHeight = this.$el.clientHeight;
let scrollTop = this.$el.scrollTop; if (scrollTop + clientHeight >= scrollHeight || this.enableLoadMore) {
this.doLoadMore()
}
},
touchEnd(e) {
if (this.isLoading) {
return;
} let endX = e.changedTouches[0].pageX,
endY = e.changedTouches[0].pageY,
dy = this.startY - endY,
dx = endX - this.startX;
if(Math.abs(dx) < 2 && Math.abs(dy) < 2) {
return;
}
if (endY < this.startY) {
this.scrollToEnd(e)
}
},
doLoadMore() {
this.isLoading = true
this.loadMoreText = '加载中...'
this.onLoadMore(this.loadDone);
},
loadDone() {
this.isLoading = false;
this.loadMoreText = '上拉加载更多'
}
}
}
</script>
<style lang="scss" scoped>
.load-more-wrapper {
height: 100%;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
transition-duration: 300ms;
.load-more, .load-end {
color: #aea699;
font-size: .26rem;
margin: .3rem 0;
text-align: center;
}
} </style>

使用如下:

Main.vue

<template>
<div class="main-page-wrapper">
<LoadMore :onLoadMore="onLoadMore" :enableLoadMore="enableLoadMore">
<ListItem :listData="listData"></ListItem>
</LoadMore>
</div>
</template>
<script>
import ListItem from './ListItem'
import LoadMore from './LoadMore'; import { getListData } from '../js/service.js' export default {
name: "MainPage",
components: {
ListItem,
LoadMore
},
data() {
return {
listData: [],
page: 0,
enableLoadMore: true,
}
},
methods: {
onLoadMore(done) {
setTimeout(()=>{
if(!this.enableLoadMore) {
return
}
this.page = this.page + 1
this.getListData();
done();
}, 200)
},
getListData() {
let reqData = {
reqData: "接口请求字段"
}
getListData(reqData).then((res)=> {
if(res.length < 20) {
this.enableLoadMore = false
}
this.listData = this.listData.concat(res);
})
}
}
}
</script>
<style lang="scss" scope>
.main-page-wrapper {
position: relative;
display: flex;
height: 100%;
-webkit-box-orient: vertical;
flex-direction: column;
}
</style>

vue移动端上拉加载更多的更多相关文章

  1. vue2.0 移动端,下拉刷新,上拉加载更多插件,修改版

    在[实现丰盛]的插件基础修改[vue2.0 移动端,下拉刷新,上拉加载更多 插件], 1.修改加载到尾页面,返回顶部刷新数据,无法继续加重下一页 2.修改加载完成文字提示 原文链接:http://ww ...

  2. 原生js移动端touch事件实现上拉加载更多

    大家都知道jQuery里没有touch事件,所以在移动端使用原生js实现上拉加载效果还是很不错的,闲话不多说,代码如下: //获取要操作的元素 var objSection = document.ge ...

  3. 移动端touch事件 || 上拉加载更多

    前言: 说多了都是泪,在进行项目开发时,在上拉加载更多实现分页效果的问题上,由于当时开发任务紧急,所以就百度找了各种移动端的上拉下拉 实现加载更多的插件.然后就留下了个坑:上拉加载的时候会由于用户错误 ...

  4. 基于SwiperJs的H5/移动端下拉刷新上拉加载更多的效果

    最早时,公司的H5项目中曾用过点击一个"加载更多"的DOM元素来实现分页的功能,后来又用过网上有人写的一个上拉加载更多的插件,那个插件是页面将要滚动到底部时就自动请求数据并插入到页 ...

  5. 基于SwiperJs的H5/移动端下拉刷新上拉加载更多

    最早时,公司的H5项目中曾用过点击一个"加载更多"的DOM元素来实现分页的功能,后来又用过网上有人写的一个上拉加载更多的插件,那个插件是页面将要滚动到底部时就自动请求数据并插入到页 ...

  6. 【Web】移动端下拉刷新、上拉加载更多插件

    移动网站中常常有的功能:列表的下拉刷新.上拉加载更多 本例介绍一种简单使用的移动端下拉刷新.上拉加载更多插件,下载及参考地址:https://github.com/ximan/dropload 插件依 ...

  7. 移动端实现上拉加载更多(使用dropload.js vs js)

    做下笔记,:移动端实现上拉加载更多,其实是数据的分段加载,在这里为了做测试我写了几个json文件作为分段数据: 方式一:使用dropload.js; 配置好相关参数及回调函数就可使用:代码如下 var ...

  8. 移动端h5列表页上拉加载更多

    背景 上星期公司要求做一个回收书籍的h5给安卓用,里面有一个功能是回收记录列表.设计师那边出的稿子是没有要求分页或者是上拉刷新的,但是众所周知,列表页数据很多的情况下,h5加载是很慢的.所以我一开始是 ...

  9. vue mpvue 上拉加载更多示例代码

    vue 上拉加载更多示例代码 可以比较简单的改为 mpvue , 去除滚动判断,直接放在 onReachBottom 周期即可. html <div id="app"> ...

随机推荐

  1. 多client并发登录

    //LoginClient.java package mySocket; import java.io.BufferedReader; import java.io.InputStreamReader ...

  2. Mesh BRep Shapes

    Mesh BRep Shapes eryar@163.com Abstract. 当对OpenCASCADE的BRep表示法的数据结构有了一定的理解后,建议可以自己实现一个显示数据生成的功能,即网格剖 ...

  3. js插件---强大的图片裁剪Cropper

    js插件---强大的图片裁剪Cropper 一.总结 一句话总结:官网或者github里面的文档或者demo才是真的详细 使用的话找到图片裁剪后的base64数据,然后这个数据可下载可传递到服务器 1 ...

  4. poj--2391--Ombrophobic Bovines(floyd+二分+最大流拆点)

    Ombrophobic Bovines Time Limit: 1000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u ...

  5. MySQL外键的介绍

    在MySQL 3.23.44版本后,InnoDB引擎类型的表支持了外键约束. 1.MySQL中“键”和“索引”的定义相同,所以外键和主键一样也是索引的一种.不同的是MySQL会自动为所有表的主键进行索 ...

  6. Weka中数据挖掘与机器学习系列之Weka3.7和3.9不同版本共存(七)

    不多说,直接上干货! 为什么,我要写此博客,原因是(以下,我是weka3.7.8) 以下是,weka3.7.8的安装版本. Weka中数据挖掘与机器学习系列之Weka系统安装(四) 基于此,我安装最新 ...

  7. 解决plsql遇到乱码的问题

    遇到问题: PLSQL中汉字显示乱码,并且SQL语句中如果有汉字,则执行时报错.其实并不是SQL语句写的有问题,而是系统不能识别汉字. 解决方法. 首先执行语句 select * from V$NLS ...

  8. SpringBoot 整合 Mybatis 和 Mysql (详细版)

    结构如下 1.引入相关依赖 <!--mysql--><dependency> <groupId>mysql</groupId> <artifact ...

  9. hdu1533Going Home KM算法

    //给一个n*m的图, //m表示人,h表示房子 //问全部人走回家的最小步数 //每一个人仅仅能进一间房 //非常明显的最大带权匹配 //每一个人到每每间房的距离即为权值 //因为是求最小,仅仅要改 ...

  10. HDU 1429 胜利大逃亡(续)(bfs)

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...