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. 什么是 &quot;署名-非商业性使用-同样方式共享&quot;

    什么是 "署名-非商业性使用-同样方式共享" 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致& ...

  2. 判断DataGridView滚动条是否滚动到当前已加载的数据行底部

    private void dataGridView1_Scroll(object sender, ScrollEventArgs e) {   if (e.ScrollOrientation == S ...

  3. js阻止默认事件与js阻止事件冒泡

    e.stopPropagation(); //阻止事件冒泡 功能:停止事件冒泡 function stopBubble(e) { // 如果提供了事件对象,则这是一个非IE浏览器 if ( e &am ...

  4. BZOJ 1305 二分+网络流

    思路: 建图我根本没有想到啊--. (我是不会告诉你我借鉴了一下题解的思路) 把每个人拆成喜欢的和不喜欢的点 男 喜欢 向 男 不喜欢 连 边权为k的边 如果男喜欢女 那么 男喜欢向 女喜欢 连 1 ...

  5. BZOJ 1306 DFS

    思路: 搜索就好 (注意不要枚举太多东西) //By SiriusRen #include <cstdio> using namespace std; int n,point[10],an ...

  6. XDoclet学习

    XDoclet可以通过你在java源代码中的一些特殊的注释信息,自动为你生成配置文件.源代码等等,例如web.ejb的部署描述文件.为你生成struts的struts-config.xml配置文件.j ...

  7. react 组件使用的小记第一天

    //定义一个子组件 var Child = React.createClass({ getInitialState: function() { return {liked: false}; }, ha ...

  8. 做raid1 经验总结

    背景: MHP 3楼一台ThinkServer  TS200 老服务器做RAID1,硬盘为: 2块3T RAID 设定里显示: 制作RAID1  只有700G多点可做. 系统安装: 可以正常在700G ...

  9. 应对加密js的三种方法

    经常遇到网页在登录后会对用户输入的帐号和密码通过js进行加密,导致模拟登录这类网站时受到阻碍 这里小记一下当前解决该问题的三种方法 1.利用python实现js同等加密. 2.利用selenium模拟 ...

  10. 织梦(dedecms)彩色标签云(tag)随机颜色和字体大小

    1.选择你所要加页面的模板,一般是在首页index.htm 加上如下代码 01 <!-- /下面开始tag标签云 --> 02 <dl class="tbox light& ...