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

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

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

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

好了下面直接上代码!

1、template部分:

1
2
3
4
5
6
7
8
9
10
11
12
<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部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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++);
                }
            }
        },
    }
}

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

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

    闲来无事,琢磨着写点东西.貌似页面下拉加载数据,瀑布流的效果很火,各个网站都能见到各式各样的展示效果,原理大同小异.于是乎,决定自己写一写这个效果,希望能给比我还菜的菜鸟们一点参考价值. 在开始之前, ...

  2. 关于Vue中页面(父组件)下拉,页面中的子组件加载更多数据的实现方法

    一个项目中存在很多这种情况:父组件(页面)中的子组件需要做下拉加载更多的需求,但是这个下拉到底部的动作只能通过监控页面(父组件)来完成 这就需要父子组件之间的通信,代码如下: 1. 建立一个用于父子组 ...

  3. 微信小程序采坑之上拉触底加载更多和下拉刷新

    小程序中加载更多数据一般都是触底刷新 有自带的函数: onReachBottom: function (){} 但是在使用时触发完全没有反应,后来尝试给外层加了一个高度,解决问题 仔细想想也是,没有设 ...

  4. listview下拉刷新 上拉(滑动分页)加载更多

    最 近做的类似于微博的项目中,有个Android功能要使用到listview的向下拉刷新来刷新最新消息,向上拉刷新(滑动分页)来加载更多.新浪微博就是使用这种方式的典型.当用户从网络上读取微博的时候, ...

  5. h5 实现页面上拉加载更多数据

    您好,您的上拉加载更多的代码来喽: html:(style部分:html部分:js部分--js部分主要就是监控上拉,调接口) //上拉加载更多css <style> .wait-loadi ...

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

    注意和后端配合就行了,前端也只能把数据拼接起来! 无论是下拉加载还是加载更多,一样的道理! 注意首次加载传递参数 注意每次加载数据数 wxml <view class='table-rank'& ...

  7. html ajax请求 php 下拉 加载更多数据 (也可点击按钮加载更多)

    <input type="hidden" class="total_num" id="total" value="{$tot ...

  8. 小程序上拉加载更多数据(onReachBottom)

    <!--pages/test/test.wxml--> <block wx:for="{{list}}" wx:key="item.id"&g ...

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

    var stop=true; $(window).scroll(function(){ totalheight = parseFloat($(window).height()) + parseFloa ...

随机推荐

  1. 使用hibernate从一方获取多方信息时报错:org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role

    引起原因:hibernate加载关联对象的方式有懒加载方式和立即加载方式. 如果在多对一的配置中没有指定加载方式,而一对多的配置中指定了懒加载方式,因此在获取一方是可获取到值,而获取多方时sessio ...

  2. 常量表达式和constexpr(c++11)

    常量表达式 常量表达式是指值不会改变且在编译阶段就能得到计算结果的表达式(两点要求) ; //是常量表达式 ; //是常量表达式 "; const int siz=s.size(); //不 ...

  3. MATLAB拟合正态分布

    clear;clc;close all format compact %% 正态分布的拟合 % 生成随机数 num = 50; y = randn(1000,1); x = 1:num; y = hi ...

  4. noip第18课作业

    1. 银行取款 [题目描述] 在现代文明社会中,大家在诸如银行办理业务.车站买票等活动时都很文明没有插队的现象,本着“先来先服务”的规矩. 新年马上到了,明明的爸爸打算上银行去取点钱,带着一向表现很好 ...

  5. java基础-day6

    第06天 java基础语法 今日内容介绍 u Eclipse断点调试 u 基础语法的练习 第1章   Eclipse断点调试 1.1      Eclipse断点调试概述 Eclipse的断点调试可以 ...

  6. 转载:readLine()与read()

    版权声明:本文为原博主原创文章,未经博主允许不得转载. https://blog.csdn.net/sinat_31057219/article/details/78742653 参考: readLi ...

  7. 5.form表单验证

    自定义验证: 其他验证:

  8. CSS 基础 例子 最小高度和最大高度设置

    最小高度,无论什么时候,高度不会小于该值,即使内容很少,不限制高度最大值,超出时候,按照实际内容来决定高度 最大高度,无论什么时候,高度不会大于该值,即使内容很多,不限制最小高度,超出时候,多出部分会 ...

  9. 7.与python交互

    与python交互 在熟练使用sql语句的基础上,开始使用python语言提供的模块与mysql进行交互 这是我们在工作中大事要做的事 先学会sql是基础,一定要熟练编写sql语句 安装引入模块 安装 ...

  10. Android-多线程安全问题-synchronized

    先看一个售票案例Demo,多线程程序对共享数据操作引发的安全问题: package android.java.thread09; /** * 售票线程 */ class Booking impleme ...