vue10行代码实现上拉翻页加载更多数据,纯手写js实现下拉刷新上拉翻页不引用任何第三方插件

vue10行代码实现上拉翻页加载更多数据,纯手写js实现下拉刷新上拉翻页不引用任何第三方插件/库
一提到移动端的下拉刷新上拉翻页,你可能就会想到iScroll插件,没错iScroll是一个高性能,资源占用少,无依赖,多平台的javascript滚动插件。iScroll不仅仅是 滚动。它可以处理任何需要与用户进行移动交互的元素。在你的项目中包含仅仅4kb大小的iScroll,你的项目便拥有了滚动,缩放,平移,无限滚动,视差滚动,旋转功能。iScroll的强大毋庸置疑,本人也非常欢迎大家使用iScroll。还有dropload也是挺好用的。
本文讲到的上拉翻页加载更多方法的核心思路其实很简单,思路一看就懂,大道至简嘛,虽然代码很少,不过实现过程中的视图与数据的交互逻辑还有有些复杂,不细心的话,很容易蒙圈,往往特别简单的东西,背后都有很细致入微的逻辑关系。
本文的方法,初步是在vue-cli的环境下实现,代码包含了template和script,方法有用到document,window对象,初版有些粗糙。

本文实现上拉翻页加载更多的核心思路就是:如果“正在加载”这个层被上拉超出页面底部,就触发加载下一页的方法,对就是这么简单!

本文方法最繁琐的地方主要在于交互方面:几个“正在加载”的层根据数据渲染的时机和上拉操作时候的显隐控制。方法里面大多数语句后面都有注释讲解,细心点应该能理顺逻辑。本文只写了上拉翻页的功能展示,下来刷新更简单也同样的道理(每次触发都只加载第一页就可以了),本文的方法思路同样可以运用于jquery、react、angular……等其他框架,因为简单,所以便捷。理解思路最重要,理解以后完全可以自己手写。
有时候看似复杂的问题,往往可以剑走偏锋,曲线救国!

好了下面直接上代码!

1、template部分:

<template>
	<div v-if="!!dataList.length">
        <div v-for="(item,index) in dataList">
            <!-- 数据展示列表 -->
        </div>
        <div id="loadMore" v-show="loadMore">正在加载</div><!-- 第一次加载数据 -->
        <div id="loadMoreing" v-show="loadMoreing">正在加载</div><!-- 上拉加载数据 -->
        <div id="noMoreData" v-show="loadMore?false:!loadMoreing">已显示全部任务</div><!-- 所有数据加载完成 -->
	</div>
	<div id="loadMoreing" v-else-if="loadMoreing">正在加载</div><!-- 页面渲染时 -->
    <div class="noData" v-else>没有数据</div>
</template>

2、script部分

    export default {
        data () {
        	return {
                dataList:new Array,
                dataCurPage:1,// 数据页码
                loadMore:true,// 第一次加载数据时的正在加载
                loadMoreing:true,// 上拉加载数据时的正在加载
        	}
        },
        mounted:function(){
            let onScroll = window.addEventListener(‘scroll‘, this.scrollRun);// 监听滚动
        },
        methods:{
        	getdataList:function(){
        		this.loadMoreing = true;
        		let _self = this;
        		$.ajax({
        			type:"post",
        			async: false,
                    timeout : 10000,
        			dataType:"json",
        			url:"",
        			data:{curPage:_self.dataCurPage},
        			success:function(data){
        				_self.loadMoreing = false;// 接收到数据时,隐藏正在加载
        				if(!!data.dataList.length){// 如果有数据
        			        if(_self.dataCurPage==1){// 当加载第1页数据时
        						_self.dataList = new Array;// 第1页清空数据
        			            if(data.dataList.length>0){// 如果第1页数据条数大于0
        							data.dataList.forEach(function(ele,i){
        								_self.dataList.push(ele);// 填充页面数据
        							})
        							_self.loadMore = true;// 显示正在加载(在屏幕底部以外)
        			            }else{
        			            	_self.loadMore = false;// 没有数据则隐藏正在加载
        			            }
        			        }else{// 当加载第2页及其以后的数据时
        			            if(data.dataList.length>0){
        							data.dataList.forEach(function(ele,i){
        								_self.dataList.push(ele);// 填充页面数据
        							})
        							_self.loadMore = true;// 显示正在加载(在屏幕底部以外)
        			            }else{
        			            	_self.loadMore = false;// 没有数据则隐藏正在加载
        			            }
        			        }
        			        //如果总页数==当前页=>没有更多数据了
        			        if(data.totalPage==_self.dataCurPage){
        			        	_self.loadMore = false;
        			        	_self.loadMoreing = false;
        			        }
        			    }
        			},
                    error:function(xhr,status,error){
                        console.log("错误",xhr,status,error);
                        if(status == "timeout"){_self.loadMoreing = false;weui.toast(‘请求超时‘, 800);}
                    },
                    complete:function(){_self.loadMoreing = false;}
        		})
        	},
            scrollRun:function(){// 核心代码
          		if(this.loadMore == true&&!!document.getElementById("loadMore")){//如果总共有一页以上数据,才运行
        	    	let bodyWidth = document.body.offsetWidth;
        	    	let bodyHeight = window.innerHeight*(375/bodyWidth);// 以6s屏幕为基准比例
        			let loadMoreTop = document.getElementById("loadMore").getBoundingClientRect().top*(375/bodyWidth);//loadMore距离顶部的距离

        			if(bodyHeight-loadMoreTop>20){//loadMore被拉出底部20px时
        				// console.log("bodyHeight",bodyHeight,"loadMoreTop",loadMoreTop,"差值",bodyHeight-loadMoreTop,"页码",this.dataCurPage+1);
        				this.loadMore = false;//停止运行scrollRun,否则会触发加载所有页面
        				this.getMoreList(_self.dataCurPage++);
        			}
        		}
            },
        }
    }

  

时间: 2024-12-28 00:40:45

vue10行代码实现上拉翻页加载更多数据,纯手写js实现下拉刷新上拉翻页不引用任何第三方插件的相关文章

下拉滚动加载更多数据

简单地实现一个下拉滚动时加载更多数据的效果.这种效果经常在手机端.瀑布流时看到 1 KISSY.add('load',function(S,Core,IO,XTemplate){ 2 var $ = S.all, D = S.DOM, E = S.Event; 3 var API = { 4 'query':'query.do' 5 }; 6 var tpl = '{{#each result}}'+ 7 '<tr>'+ 8 '<td><input type="ch

ASP.NET仿新浪微博下拉加载更多数据瀑布流效果

闲来无事,琢磨着写点东西.貌似页面下拉加载数据,瀑布流的效果很火,各个网站都能见到各式各样的展示效果,原理大同小异.于是乎,决定自己写一写这个效果,希望能给比我还菜的菜鸟们一点参考价值. 在开始之前,先把实现的基本原理说一下.当夜幕下拉到底部的时候,js可以判断滚动条的位置,到达底部触发js方法,执行jquery的ajax方法,向后台一般处理程序夜幕ashx文件请求数据源,得到json格式的数据源.然后,遍历json数据源,拼接一个li标签,再填充到页面上去. 首先,我们来做个简单的html页面

微信小程序 - (下拉)加载更多数据

注意和后端配合就行了,前端也只能把数据拼接起来! 无论是下拉加载还是加载更多,一样的道理! 注意首次加载传递参数 注意每次加载数据数 wxml <view class='table-rank'> <view class='tables center' wx:for="{{ranklist}}" wx:for-index="idx" wx:key="prototype"> <view class='stage-rank

平滑的下拉加载更多数据

平滑的下拉加载更多地数据,例如下拉加载更多聊天记录,只要重写UITableView的setContentSize方法就可以实现. - (void)setContentSize:(CGSize)contentSize { if (!CGSizeEqualToSize(self.contentSize, CGSizeZero)) { if (contentSize.height > self.contentSize.height) { CGPoint offset = self.contentOff

wap 往下拉自动加载更多数据

var stop=true; $(window).scroll(function(){ totalheight = parseFloat($(window).height()) + parseFloat($(window).scrollTop()); if($(document).height() <= totalheight){ if(stop==true){ stop=false; $.post("http://www.lovexm.com/test.php", {start

Android_ListView上拉加载更多(ListView分页功能)

先上效果图 加载完数据 首先定义一个底部正在加载的布局footer_layout.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layou

硅谷新闻6--下拉刷新/上拉加载更多

 1.添加加载更多布局 1_初始化和隐藏代码在RefreshListView构造方法中调用 private void initFooterView(Context context) { View footerView = View.inflate(context, R.layout.refresh_listview_footer, null); //隐藏代码 footerView.measure(0, 0); int footerViewHeight = footerView.getMeasur

Android实战简易教程-第五十三枪(通过实现OnScrollListener接口实现上拉加载更多功能)

支持上拉加载更多的控件有很多,但是你知道背后的原理吗?有一些面试官可能会问到这方便的知识,他们认为会用不是目的,懂背后的原理才是真人才.下面我们通过实现OnScrollListener接口实现上拉加载更多的效果,这里用到了回调接口,你需要对回调进行比较好的理解,回调机制是Android中很重要的机制,下面我们看一下代码: 1.定义一个footer.xml,用于下拉提示的效果: <?xml version="1.0" encoding="utf-8"?>

iOS开发之下拉刷新,上拉加载更多

iOS开发之下拉刷新和上拉加载更多 1.简介(在我们常见的app中都有上拉以及下拉的操作,比例QQ,微信...所以上拉以及下拉的开源库比较多 上拉下拉开源库下载) 常用的下拉刷新的实现方式 (1)UIRefreshControl (2)EGOTableViewRefresh (3)AH3DPullRefresh (4)MJRefresh (5)自己实现 (一般情况不要自己实现,竟然有了没必要) 2.AH3DPullRefresh的使用 AH3DPullRefresh 也是一个上拉下拉开源库.使用