uni-app中页面的上拉加载与下拉刷新(下)

其中 loadding变量的作用为

1 uni-load-more 组件所需要的状态值。

2 保证只有一个请求中的数据。假设页面已经刷新到底部,触发数据的拉取。此时假设数据还没有返回的时候,用户又拼命的继续操作。这就会导致同时几个分页在拉取数据,容易导致口的串联访问,会导致数据得错乱。

kotlin 复制代码
if(this.loading == 'loading' || this.loading == 'noMore'){return}

当我们使用loading变量的时候,如果有没处理的完成的请求就要拦截掉其余请求,这样能保证数据得准确。

query_params中,除了分页必须的参数外,就是别的对列表的筛选字段了,筛选字段发生变化时候,需要初始化分页跟筛选条件,重新拉取数据。

list_data中就是存储的拉取到的数据,用于数据的循环与便利。

2 变量定义完成以后,就是核心得拉取数据方法了 methods方法中定义 fetchData数据拉取的方法。

kotlin 复制代码
fetchData(isLoadMore=false){
    if(isLoadMore){
        if(this.loading == 'loading' || this.loading == 'noMore'){return}	
    }
    this.loading = 'loading'
    if(isLoadMore){
        this.query_params.pageNo ++
    }else{
        this.query_params.pageNo = 1
        this.list_data = []
    }
    
    this.$api.listService(this.query_params)
    .then(res=>{
        let {result} = res
        if(result.records.length == 0 || result.pages == result.current){
            this.loading = 'noMore'
        }else{
            this.loading = 'more'
        }

        this.list_data =this.list_data.concat(res.result.records)
    })
}

方法中需要有一个唯一的参数 isLoadMore默认值是 false。当前参数意思为,是否拉取新一页的数据。

if(isLoadMore){ }这个判断就是在判断是否有处理中的请求,如果有就要中断本次数据的处理。

this.loading = 'loading' 立刻将当前请求变成处理中的,拦截后续请求,防止数据的错乱。

对于加载更多数据,或者是筛选条件发生改变重新拉取数据两种情况的分页处理方式是不同的。前者要求页面数 +1 而后者是要求页码数变成 1 然后已有的列表数据清空的。

下面就是拉取数据的业务,当拉取数据完成以后。需要判断列表中的数据是否已经为空了。为空则代表数据已经没了,此时 loading变成noMore拦截掉后续所有的数据请求。如果还有数据,那loading的状态变成more 代表用户可以继续进行下拉数据 查看更多的数据。

3 不同的位置调用fetchData 拉取数据即可。只是参数的不同而已。

javascript 复制代码
	handleScrollToLower(e){
                this.fetchData(true)
        },
         handleSearch(){
                this.fetchData()
        },

除了滚动到底部需要更多数据传递true外,其他需要初始化的位置都直接调用即可。

分页拉取数据的业务的总结

上面完整的从 静态页面 到逻辑都很详细的介绍了分页的实现方式。当后续页面中涉及到分页业务的时候,我们不需要过多的去思考怎么实现,直接去拷贝过来核心代码,稍微进行修改即可非常容易的完成这个功能。

拷贝内容区域

xml 复制代码
<!-- 内容区域 -->
<view class="sec1">
    <scroll-view 
    :style="'height:'+ (window_height-120) +'px'" 
    scroll-y="true" 
    @scrolltolower="handleScrollToLower">
        <view class="swiper_item"  v-for="(it,ind) in list_data" :key="ind">
            
        </view>
        <view><uni-load-more :status="loading"></uni-load-more></view>
    </scroll-view>
</view>

拷贝 分页所需参数

vbnet 复制代码
loading:'',   // more/loading/noMore
query_params:{
        pageNo:1,
        pageSize:3,
        typeOne:'',
        typeTwo:'',
        provinceId:'',
        cityId:'',
        areaId:'',
        rank:1,
},
list_data:[]

拷贝 fetchData方法 还有初始化高度的方法(上方已经出现过)

拷贝滚动到底部的具体实现

javascript 复制代码
handleScrollToLower(e){
        this.fetchData(true)
},

这样稍加修改即可快速简单的实现分页。

相关推荐
陈随易2 小时前
在 VSCode 里,把项目一键部署到服务器
前端·后端·程序员
Highcharts.js2 小时前
教程:基于 React + Highcharts 构建一个单页应用程序、按需数据拉取与图表渲染
开发语言·前端·数据结构·react.js·前端框架·highcharts·页面应用
To_OC3 小时前
我被 useState 坑了两次之后,终于把它的脾气摸透了
前端·javascript·react.js
鱼樱前端3 小时前
我用 Claude Code 后,编码效率翻 3 倍。但更值钱的是别的。
前端·后端·ai编程
_lucas3 小时前
给知识库网站接入AI问答
前端·ai编程·全栈
前端糕手4 小时前
前端面试题大全:JavaScript + Vue3 + React + TypeScript + 工程化 + 性能优化
前端
我不叫武5 小时前
一个用 Rust 写的离线编码查询桌面工具
前端
Web4Browser6 小时前
指纹浏览器 API 自动化怎么接:启动 Profile、获取 CDP 端点并连接自动化框架
前端·网络·typescript·自动化
Patrick_Wilson6 小时前
从 React 到 Flutter:写给前端的一张跨端知识地图
前端·flutter·react.js
颜酱6 小时前
06 | 把 meta_config 同步进 MySQL(生成阶段)
前端·人工智能·后端