前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >上拉加载下拉刷新了解下

上拉加载下拉刷新了解下

作者头像
IMWeb前端团队
发布2019-12-03 17:57:46
1.7K0
发布2019-12-03 17:57:46
举报
文章被收录于专栏:IMWeb前端团队IMWeb前端团队

本文作者:IMWeb 气势的信心 原文出处:IMWeb社区 未经同意,禁止转载

老样子,我们先,哦不,今天我们直接上思路,没有效果图,真的没有
image
image
我们依旧从界面及逻辑两块进行分析

1.界面上,只分成简单的两块,一块是上方的刷新文字,一块是下方的内容,然后将上方提示内容隐藏在屏幕之外,一般由两种方式,一种是上面遮一层,另一种是marginTop:负值将其弄出屏幕外,这里我采用的是第一种,代码也很简单,就随便贴一下

代码语言:javascript
复制
.header{    
    width: 100%;    
    height: 1rem;这里的高度应该与刷新文字一样高    
    position: fixed;    
    z-index: 100;
}

2.功能实现的重头戏是在逻辑上,主要分成下面几个部分

  • 监听事件
  • 位置计算
  • 控制界面变化
  • 数据更新包

我一个一个进行分析,然后带你们入坑。

image
image
监听事件,这块简单,直接贴代码
代码语言:javascript
复制
//el为下拉的整个节点//这里为添加监听
this.el.addEventListener('touchstart', this.refreshTouchStart);
this.el.addEventListener('touchmove', this.refreshTouchMove);
this.el.addEventListener('touchend', this.refreshTouchEnd);//记住在不用的时候要移除监听哦
this.el.removeEventListener('touchstart', this.refreshTouchStart);
this.el.removeEventListener('touchmove', this.refreshTouchMovee);
this.el.removeEventListener('touchend', this.refreshTouchEnd);//具体的函数,我们直接在位置计算中看
位置计算 我们分下拉刷新,上拉加载两块计算,分析可得

下拉刷新的逻辑 = 当前页面的首项在屏幕中且容器向下滑动的距离大于一定值 上拉加载的逻辑 = 当前页面已滑动到底部 好,我们直接看具体的实现逻辑代码

代码语言:javascript
复制
//代码中包含界面变化和数据更新,仔细看哦
refreshTouchStart(e) {    
    let touch = e.changedTouches[0];    
    this.tipText = '下拉刷新';//下拉提示文字    
    this.startY = touch.clientY;//获得当前按下点的纵坐标
}

refreshTouchMove(e) {    
    this.$store.commit('bottomShowFalse');//与本逻辑无关,滑动时隐藏底部作用    
    let touch = e.changedTouches[0];    
    let _move = touch.clientY - this.startY;//获得滑动的距离    
    this.bottomFlag = $('.present-box').offset().top + $('.present-box').height() - document.body.clientHeight <= 40;//滑动到底部标识    
    if ($('.present-box').offset().top >= this.headerHeight) {//内容主体超出了一个头部的距离        
        if (_move > 0 && _move < 1000) {//滑动距离>0代表下拉//<1000是为了防止神人无限拉阿拉            
            this.el.style.marginTop = _move + 'px';//根据拉的距离,实现界面上的变化(界面变化)            
            this.moveDistance = touch.clientY - this.startY;//记录滑动的距离,在松手后让他滑啊滑滑回去            
            if (_move > 50) {//拉到一定程度再下拉刷新,防止误操作                
               this.tipText = '松开即可刷新'//上面有了            
            }        
        }
    }
}
refreshTouchEnd() {    
    this.$store.commit('bottomShowTrue');//松开后底部就biu的出现啦    
    if (this.bottomFlag) {//若符合上拉加载的条件,则直接进行数据更新        
        this.$emit('loadBottom');    
    }    
    let that = this;    
    if (this.moveDistance > 50) {//拉了一定距离才触发加载动作        
        this.tipText = '数据加载中...';        
        let timer = setInterval(function () {            
            that.el.style.marginTop = that.el.style.marginTop.split('px')[0] - 5 + 'px';//如果拉的很长,一次性弹回去影响用户体验,所以先让他弹到50的高度,然后再进行数据更新            
            if (Number(that.el.style.marginTop.split('px')[0]) <= 50) {//小于50后就不进行界面变化了,先进行数据更新再变化                
                clearInterval(timer);                
                new Promise((resolve, reject) => {                    
                that.$emit('loadTop', resolve, reject);//通知父控件,下拉刷新条件满足了,你更新吧                
                }).then(() => {
                    that.resetBox();                
                }).catch(() => {
                    that.resetBox();//界面恢复(也就是弹回去啦)                
                });           
            }       
        }, 1);//通过一个promise,让数据更新结束后再进行界面变化。也可以采用其他的方式,如async await方式   
     } else {
        this.resetBox();    
     }
}
resetBox() {
    let that = this;    //使用定时器的方式,biubiubiu的实现滑动界面刷新的效果。    
    if (this.moveDistance > 0) {
        let timer = setInterval(function () {
            that.el.style.marginTop = that.el.style.marginTop.split('px')[0] - 1 + 'px';            
            if (Number(that.el.style.marginTop.split('px')[0]) <= 0) clearInterval(timer);//这里很重要,不删除,可能看到奇奇怪怪的东西哦        
        }, 1)    
    }    
    this.moveDistance = 0;    
}
核心代码就这些了,撒花完结,优化什么的,你们自己看着来咯,大佬别打我,效果图来了嘛
image
image
我就是效果图
image
image

这是我的github,欢迎大佬们猛戳,不定时更新

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-09-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 老样子,我们先,哦不,今天我们直接上思路,没有效果图,真的没有
  • 我们依旧从界面及逻辑两块进行分析
  • 监听事件,这块简单,直接贴代码
  • 位置计算 我们分下拉刷新,上拉加载两块计算,分析可得
  • 核心代码就这些了,撒花完结,优化什么的,你们自己看着来咯,大佬别打我,效果图来了嘛
  • 我就是效果图
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档