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>

最新文章

  1. 【java开发】面向对象初步认识与基础概念讲解
  2. [Doxygen]Doxygen
  3. android中的广播接收实现总结
  4. MVC4 Filter 验证客户端访问类型(移动端、PC端)
  5. WPF中的文字修饰
  6. hdu 4091 Zombie’s Treasure Chest(数学规律+枚举)
  7. In-Cell、On-Cell和OGS全贴合屏幕技术区别
  8. 函数原型属性-JavaScript深入浅出(三)
  9. IE 11 flex布局兼容性问题 ---- 不支持min-height 和flex:1
  10. Monkey测试简介
  11. Android Studio项目引入外部库注意事项(zxing)
  12. 【blog】MySQL中tinytext、text、mediumtext和longtext详解
  13. Jquery——几个注意的小知识
  14. Selenium测试Ajax应用程序中的主要问题
  15. Linux内核之vmlinux与vmlinuz
  16. SO_KEEPALIVE选项
  17. bzoj3205 [Apio2013]机器人
  18. vue-cli使用说明
  19. 获取apk package name(包名)以及activity name
  20. Python日志统计

热门文章

  1. POJ 3670 Eating Together(LIS)
  2. Sam做题记录
  3. Bundle捆绑压缩技术
  4. 链接服务器T-sql语句
  5. JAVA学习书籍
  6. Ubuntu16.04安装官方Firefox 火狐浏览器 延长支持版(Extended Support Release, 简称“ESR”)
  7. 如何更改AD域安全策略-密码必须符合复杂性要求
  8. How Javascript works (Javascript工作原理) (十三) CSS 和 JS 动画底层原理及如何优化其性能
  9. BFC 和 haslayout
  10. linux下安装配置rabbitMQ