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移动端上拉加载更多的更多相关文章
- vue2.0 移动端,下拉刷新,上拉加载更多插件,修改版
在[实现丰盛]的插件基础修改[vue2.0 移动端,下拉刷新,上拉加载更多 插件], 1.修改加载到尾页面,返回顶部刷新数据,无法继续加重下一页 2.修改加载完成文字提示 原文链接:http://ww ...
- 原生js移动端touch事件实现上拉加载更多
大家都知道jQuery里没有touch事件,所以在移动端使用原生js实现上拉加载效果还是很不错的,闲话不多说,代码如下: //获取要操作的元素 var objSection = document.ge ...
- 移动端touch事件 || 上拉加载更多
前言: 说多了都是泪,在进行项目开发时,在上拉加载更多实现分页效果的问题上,由于当时开发任务紧急,所以就百度找了各种移动端的上拉下拉 实现加载更多的插件.然后就留下了个坑:上拉加载的时候会由于用户错误 ...
- 基于SwiperJs的H5/移动端下拉刷新上拉加载更多的效果
最早时,公司的H5项目中曾用过点击一个"加载更多"的DOM元素来实现分页的功能,后来又用过网上有人写的一个上拉加载更多的插件,那个插件是页面将要滚动到底部时就自动请求数据并插入到页 ...
- 基于SwiperJs的H5/移动端下拉刷新上拉加载更多
最早时,公司的H5项目中曾用过点击一个"加载更多"的DOM元素来实现分页的功能,后来又用过网上有人写的一个上拉加载更多的插件,那个插件是页面将要滚动到底部时就自动请求数据并插入到页 ...
- 【Web】移动端下拉刷新、上拉加载更多插件
移动网站中常常有的功能:列表的下拉刷新.上拉加载更多 本例介绍一种简单使用的移动端下拉刷新.上拉加载更多插件,下载及参考地址:https://github.com/ximan/dropload 插件依 ...
- 移动端实现上拉加载更多(使用dropload.js vs js)
做下笔记,:移动端实现上拉加载更多,其实是数据的分段加载,在这里为了做测试我写了几个json文件作为分段数据: 方式一:使用dropload.js; 配置好相关参数及回调函数就可使用:代码如下 var ...
- 移动端h5列表页上拉加载更多
背景 上星期公司要求做一个回收书籍的h5给安卓用,里面有一个功能是回收记录列表.设计师那边出的稿子是没有要求分页或者是上拉刷新的,但是众所周知,列表页数据很多的情况下,h5加载是很慢的.所以我一开始是 ...
- vue mpvue 上拉加载更多示例代码
vue 上拉加载更多示例代码 可以比较简单的改为 mpvue , 去除滚动判断,直接放在 onReachBottom 周期即可. html <div id="app"> ...
随机推荐
- 什么是 "署名-非商业性使用-同样方式共享"
什么是 "署名-非商业性使用-同样方式共享" 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致& ...
- 判断DataGridView滚动条是否滚动到当前已加载的数据行底部
private void dataGridView1_Scroll(object sender, ScrollEventArgs e) { if (e.ScrollOrientation == S ...
- js阻止默认事件与js阻止事件冒泡
e.stopPropagation(); //阻止事件冒泡 功能:停止事件冒泡 function stopBubble(e) { // 如果提供了事件对象,则这是一个非IE浏览器 if ( e &am ...
- BZOJ 1305 二分+网络流
思路: 建图我根本没有想到啊--. (我是不会告诉你我借鉴了一下题解的思路) 把每个人拆成喜欢的和不喜欢的点 男 喜欢 向 男 不喜欢 连 边权为k的边 如果男喜欢女 那么 男喜欢向 女喜欢 连 1 ...
- BZOJ 1306 DFS
思路: 搜索就好 (注意不要枚举太多东西) //By SiriusRen #include <cstdio> using namespace std; int n,point[10],an ...
- XDoclet学习
XDoclet可以通过你在java源代码中的一些特殊的注释信息,自动为你生成配置文件.源代码等等,例如web.ejb的部署描述文件.为你生成struts的struts-config.xml配置文件.j ...
- react 组件使用的小记第一天
//定义一个子组件 var Child = React.createClass({ getInitialState: function() { return {liked: false}; }, ha ...
- 做raid1 经验总结
背景: MHP 3楼一台ThinkServer TS200 老服务器做RAID1,硬盘为: 2块3T RAID 设定里显示: 制作RAID1 只有700G多点可做. 系统安装: 可以正常在700G ...
- 应对加密js的三种方法
经常遇到网页在登录后会对用户输入的帐号和密码通过js进行加密,导致模拟登录这类网站时受到阻碍 这里小记一下当前解决该问题的三种方法 1.利用python实现js同等加密. 2.利用selenium模拟 ...
- 织梦(dedecms)彩色标签云(tag)随机颜色和字体大小
1.选择你所要加页面的模板,一般是在首页index.htm 加上如下代码 01 <!-- /下面开始tag标签云 --> 02 <dl class="tbox light& ...