uniapp-实现触底加载&拼接新数据~

本文可能能比较清晰讲解一下uniapp如何实现触底加载新数据

首先要有一个接口

https://ku.qingnian8.com/dataApi/news/newslist.php

一个数据请求的接口

里面的数据大概长这样~

但是我们还需要知道这个接口有哪些参数

比如有

num 3条

page 哪一页

思想是:在触底的是后再次获取网络请求,但是在获取网络请求是要让page即页码++了,即要请求来新数据

分析:

其实num和page是互通的

总共有若干条数据

num设置几条数据为一页,将整体数据分成 总数/num 组

page设置取到分号页后,哪一页的数据。

你通过测试这个接口就可以发现这个特点~一共262条数据,num=5,page=2获取到id为253-257的数据,num=2,page=4获取到id为255和256的数据。空间的,num简洁决定着分页数。而不是容易误解的,"这一页的其他数据怎么不要了嘞?",其实是这一页的数据已经取完了。

在data中设置一个currentPage属性,可以把它设置成random每次登录后结果为随机的计算属性用computed:{},最简单的是把它设置成一个定值,每当一进来,首先看到的都是这页的数据,然后再一页一页地翻。

实现:

在data中设置一个currentPage属性,

在请求逻辑中的 参数 里,按照接口文档给的

设置一个:

page:this.currentPage

getData(){

        uni.request({

                url:"https://ku.qingnian8.com/dataApi/news/newslist.php"

                data:{

                        cid:id,

                        page:this.currentPage

                }

                success:res=>{

                        console.log(res)

                        this.newsArr = res.data // 具体数据在哪儿看console.log出的res,然后知道我们要用的数据在哪一层(今天刚好看见对象'.'属性是层级访问)//当然我觉得这里也可以做一个拼接。就是接上之前的数据进行显示

                }

        }),

}

然后在onReachBottom中设置

this.currentPage++,

并调用请求数据的方法

this.getData()

这样一来,每次触底后幕后就执行this.currentPage++,然后执行getData()方法发送请求,对newsArr进行更新,到幕前则呈现出更新后的数据,这就是强大的Vue的【数据驱动】

当然,在每次请求时肯定需要一段时间,于是可以在getData()的开头设置一个uni.onLoading(),

然后再在uni.request({})中的complete设置一个

uni.hideLoading()

这样每次请求过程中显示onLoading()对应的效果,请求结束后不过是否请求成功,都执行uni.hideLoading()消掉uni.onLoading()的效果。

还可以设置一个防抖,不过可能没必要,因为,可能触底后,一段时间都是在触底状态(除非你上滑些许再次触底),用户一般也不会这么做,因为比较麻烦,而且一般间歇性的请求多次服务器还是承受的起的,而且一般用户要的数据本来就随机就可以(当然再有个性化推荐算法的程序中,则应该是在个性化的库中随机推荐),所以可能一般可以不做防抖。即clearTimeout()&setTimeout()机制。

但我觉着还是做一个好了,

则getData升级成

getData(){

        uni.onLoading(),

        clearTImeout(this.timer)

        this.timer = setTImout(()={

                uni.request({

                        url:'https://ku.qingnian8.com/dataApi/news/newslist.php',

                        data:{

                                cid:id,

                                page:this.currentPage

                        },

                        success:(res)=>{

                                this.newsArr = res.data

                        },

                        fali:()=>{

                        请求失败逻辑xxx如

                                uni.showToast({

                                        title: '请求失败~再试试哈~',

                                        icon: 'none',

                                        duration: 500 // 提示文字呈现时间为0.5s

                                });

                        },

                        complete:()=>{

                                uni.hideLoading()

                        }

                })

        },300)

}忽然想到能不能配一个紧急号码符字典

在请求实属着急时,若请求失败,则uni.showToast({ title:'紧急号码符' })

然后提供一个紧急号码符翻译器 ,里面通过自动查阅字典实现符号的翻译,翻译成联系方式,直接通过这个联系方式找到人工服务者进行数据调取等服务的协助~这样即能避免联系方式被用户频繁拨打,又可以给紧急情况一个可能性的兜底。

这样就比较完整了~

所以说,其实也需要后端能配合好,我们才好实现这个效果呀。

总:通过本文,我们不仅浅析推测了一下后端分页的实现方法,

还巧用onReachBottom(){}和动态数据(指newsArr和this.timer和currentPage这几个数据)、请求(uni,request())和uni.showToast()进行消息提示,结合防抖机制clearTImeout()与setTimeout(),实现一个比较完整的触底刷新

当然,实际当中,应该多用的是拼接,即刷新后看到更多,而不是刷新后就看不到上面的内容了。这也可以通过修改success:()=>{}中的内容this.newsArr = res.data改成可能可以用push()方法比如this.newsArr.push(res.data),之后若发现有错行不通我就改,似乎是得行的,大家有好方法请赐教评论区~

这里用到虾米老师提供的接口,若涉及到侵权或其他不良影响则删,也恰巧给虾米老师打个广噢~

如有错误请指正,十分感谢~

更新一下,之前没注意看到后头,现在知道怎么简便的将数组拼接了~然后我们还要防止特殊情况下的两个bug,请见后文:

关于数据(数组的拼接)的连接

可以使用contact()

而我们直接使用ES6的写法就可以了

this.newsArr = [...this.newsArr,...res.data]就可以了

别写成[this.newsArr,res.data]这样就变成是一个二维数组了。

"特殊"情况

如果是在同一页有个分类的滚动条,比如

体育 国际 养生 ...

点击每个选项跳转到不同的内容去

那么需要给跳转的那个方法中添加上一个currentPage:1或重置一下currrentPage在一个合理的取值范围内

防止两个bug

当然这是由于各选项中消息条数不同,而如果还按currentPage等于上一条来,就可能由于下一个选项中消息少,没堆到这么多页,而会出现没有东西返回的"bug"场面~

而且注意的是跳转时还要加一个就是把数据数组置为空,因为由于我们统一使用一个方法getData()获取内容,其中success中写的有事数组的拼接,则会导致跳转是时各项中的消息拼到一块去,于是在跳转到方法中还需要注意先把this.newsArr = [] 再执行getData()方法。

即:

ES6有语法[...数组,...数组]就是讲两个数组拼接起来,而不会成为一个二维数组

当同一页实现分选项出现不同消息时,

在 【点击选项跳转】 的方法中注意page值的重置如this.currentPage=xxx和先赋空数据数组再执行请求的方法如this.newsArr = [],然后再执行this.getData()。

如有错误请毫不犹豫地挑出来,十分感谢~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值