vue 上拉刷新组件
背景,项目中经常会出现需要上拉加载更多或者下拉刷新的需求,一直以来呢都是借用各种UI库来实现,但是不知道啥情况,最近在使用的时候,一直有问题,出不了效果,然人很恼火,于是只能自己动手来实现以下,
这次做得呢也很简单,只做了上拉加载更多,思路其实很简单,搞一个组件,然后弄个插槽暴露出去放列表,然后在这个组件上监听touchstart,move,end等事件
我们一般只需要已经滑到最底部了,在上滑才需要判断是否加载更多
所以我们需要弄清楚几个条件
1,是否滑动到最底部了,如果是的话,那么在监听到上滑,就计算滑动的距离,如果距离达到了阈值,那么就加载更多
在处理加载的过程中,一般会给一些文字提示,比如,login中,已经没有更多了,...
2,如果没有滑动到最底部,那么就是普通的页面滑动,我们不做处理
大体上就是这些,大部分其他的库会有一些动画效果,我这里没加,具体代码如下:
<template>
<div class="pull-wrap" @touchstart="start" @touchmove="move" @touchend="end">
<!--上拉加载组件-->
<slot ref="pull" class="pull-content"></slot>
<p v-if="isMoving" style="font-size: 20px;">pulling....</p>
<div class="is-loading" v-if="isLoading">
<img class="loading" src="../assets/images/loading.svg" alt="">
</div>
<div class="is-done" v-if="isDone">没有数据了</div>
</div>
</template> <script>
export default {
name: 'Pull',
props: {
onPull: { // 上拉的回调
type: Function,
require: true
} },
data() {
return {
startY: 0,
moveY: 0,
isMoving: false,
isLoading: false,
isDone: false,
num: 1 // history list的页数
}
},
methods: {
start(e) {
this.startY = e.touches[0].clientY;
console.log(this.startY);
},
move(e) {
if (this.isDone) return
console.log('move', e.touches[0].clientY);
// 滑动时需要检测是否到底了,如果还没到底,就不要loading
// if (this.isLoading || this.isDone) return;
let flag = this.scrollToTheEnd();
if (flag) {
this.isMoving = true
}
this.moveY = e.touches[0].clientY - this.startY;
}, end() {
// this.isMoving = false
if (this.isLoading || this.isDone) return;
console.log('touchend', this.moveY);
if (this.moveY > -40) {
console.log('没超过', this.moveY);
this.isMoving = false;
} else {
console.log('达到条件了');
let flag = this.scrollToTheEnd();
console.log(flag, '到底了吗');
if (!flag) return;
this.isMoving = false
this.num++;
this.isLoading = true;
this.onPull(this.num);
}
this.startY = 0;
this.moveY = 0;
}, /**
* 判断滚动条是否到底
*/
scrollToTheEnd() {
let scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop // 滚动的距离
let viewHeight = document.documentElement.clientHeight; // 可视区域高度
let offsetHeight = document.body.scrollHeight; // 总高度
console.log(scrollTop, viewHeight, offsetHeight, '----------------');
// 滚动条到底部的条件
return (viewHeight + scrollTop) >= offsetHeight
}
}, mounted() {
this.$on('loadEnd', () => {
console.log('load完毕了');
this.isLoading = false
}) this.$on('loadOver', () => {
console.log('没有了');
this.isDone = true;
this.isLoading = false;
this.isMoving = false;
}) }
}
</script> <style scoped lang="scss">
/*.pull-wrap{
overflow: hidden;
&>.pull-content{
transition: all .4s;
}
}*/
.pull-wrap{
font-size: 20px;
} .loading{
width: 50px;
height: 50px;
} </style>
然后使用组件的如下:
<template>
<Pull :onPull="pull" ref="pull">
<p v-for="val in list">列表了{{val}}</p>p
</Pull>
</template> <script>
import Pull from '../Pull'
methods:{ //这里就是加载更多的处理函数了,这里只是用定时器模拟了一下,需要将加载状态回传到子组件中去
pull(num) {
console.log('pull回调');
setTimeout(() => {
this.num = num;
if (this.history_list.length >= this.pk_list_data.others_family_list.length) {
console.log('完了');
this.$refs.pull.$emit('loadOver') // 加载完毕
} else {
this.$refs.pull.$emit('loadEnd') // 加载完毕
} }, 2000) }, } </script>
这样,基本就做完了,
vue 上拉刷新组件的更多相关文章
- Vue下拉刷新组件
Examples examples Installation npm install vue-pull-to --save Use Setup <template> <div> ...
- 分享一个discuz touch端的jQuery下拉刷新组件
在线Demo 最近装了个discuz论坛, 趣股VIP吧,发现里面内置的jQuery上拉刷新组件写得还行,STATICURL可以用'http://o9gzet7tk.bkt.clouddn.com/i ...
- vue loadMore 上拉刷新不能实现的坑
1.如果你写的代码没问题,但依然不能实现上拉刷新效果,那你有可能是缺少了overflow: scroll 2.如果上拉刷新一直在加载状态,需要调用this.$refs.loadmore.onBotto ...
- 【UI组件】——用jQuery做一个上拉刷新
技术要点: 1.jQuery的插件写法 2.上拉刷新步骤分解 3.css样式 jQuery的插件写法: $.fn.pluginName = function() { return this.each( ...
- 使用vux实现上拉刷新的总结
最近公司在研发app,选择了基于Vue框架的vux组件库,现总结在实现上拉刷新功能遇到的坑: 1.问题:只刷新一次,解决方法:需要自己手动重置状态 this.scrollerStatus.pullup ...
- Google自己的下拉刷新组件SwipeRefreshLayout
SwipeRefreshLayout SwipeRefreshLayout字面意思就是下拉刷新的布局,继承自ViewGroup,在support v4兼容包下,但必须把你的support librar ...
- MUI - 上拉刷新/下拉加载
新闻信息列表必备的功能,支持Table,Ul等列表. 以下是DIV版本,在安卓端或者ios端必须使用双webview模式,传送门:http://dev.dcloud.net.cn/mui/pulldo ...
- vux (scroller)上拉刷新、下拉加载更多
1)比较关键的地方是要在 scroller 组件上里加一个 ref 属性 <scroller :lockX=true height="-170" :pulldown-conf ...
- Google官方下拉刷新组件---SwipeRefreshLayout
今天在Google+上看到了SwipeRefreshLayout这个名词,遂搜索了下,发现竟然是刚刚google更新sdk新增加的一个widget,于是赶紧抢先体验学习下. SwipeRefreshL ...
随机推荐
- CF1328B K-th Beautiful String
CF1328B K-th Beautiful String,然而CF今天却上不去了,这是洛谷的链接 题意 一个长度为\(n\)的字符串,有2个\(\texttt{b}\)和\(n-2\)个\(\tex ...
- Nacos作为配置中心时,多个服务共用一个dataId的配置
写在前面 本文是对我之前一篇文章<Spring Cloud+nacos+Feign,实现注册中心及配置中心>的补充.此文章中简单写了如何将Nacos作为配置中心.在使用配置中心时,我们会遇 ...
- Java——Java代码的执行顺序
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 一.构造方法 构造方 ...
- 数位dp H - F(x) HDU - 4734
http://acm.hdu.edu.cn/showproblem.php?pid=4734 一般数位dp表示的是数的性质,这个题目也是一样,但是我们求出来的是一个函数的值,怎么把这个值转化成一类数, ...
- dbcp数据源连接池
一.数据源连接池 我们之前利用jdbc连接数据库,每次都要创建连接对象,销毁连接对象,如果并发访问量比较大,这样肯定比较辣 浪费数据库的效率,我们可以像之前mybatis中缓存查询到的数据一样,可以把 ...
- 【Spark】不熟悉Spark-shell常用参数?这一张图就够了
- 海外网站如何通过代理IP进行采集?
海外网站如何通过代理IP进行采集? 我们在做爬虫的时候,经常会遇到这种情况,爬虫最初运行的时候,数据是可以正常获取的,一切看起来都那么的美好,然而,不一会儿,就可能会出现403 Forbidden , ...
- python工业互联网应用实战1—SQL与ORM
从sql到ORM应该说也是编程体系逐步演化的结果,通过类和对象更好的组织开个过程中遇到的各种业务问题,面向对象的解耦和内聚作为一套有效的方法论,对于复杂的企业应用而言确实能够解决实践过程中很多问题. ...
- Hexo 博客利用 Nginx 实现中英文切换
本文记录了对 Hexo 博客进行中英文切换的配置过程,实现同一应用共用模版,任何页面可以切换到另一语言的对应页面,并对未明确语言的访问地址,根据浏览器语言进行自动跳转 实现细则 中英文地址区分 博客中 ...
- python语法学习第十天--类与对象相关的BIF、魔法方法
一些相关的BIF: issubclass(class,classInfo)#判断是否为子类,classInfo可以为多个类的元组,其中一个是,返回true,一个类也被认为是自己的子类,object是所 ...