上拉加载下拉刷新并根据相同数据进行分类(小程序,vue2)

想要实现的效果

后端返回的数据格式

要求:expireTime字段的年月日相同的列表放在一起,并且不影响上拉加载下拉刷新

1.首先需要解析后端返回来的数据格式

    let newarr = JSON.parse(JSON.stringify(this.DownloadList)) //这个时候newarr还是[]
    //循环后端返回的参数,筛选createTime相同的参数
	downInfo.data.data.list.forEach((item,index)=>{
        // findIndex逐个判断与creaTeTime是否相同
		let i = newarr.findIndex(it => it.daytime === item.createTime.split(' ')[0])
		console.log(i,"iiiiiiiiiii")
		if (i >= 0) {
			newarr[i].list.push(item)
		} else {
			newarr.push({
				daytime: item.createTime.split(' ')[0],
				list:[item]
			})
		}			
	})
    console.log(newarr, '=============newarr')
	this.DownloadList = newarr //最后给页面渲染参数赋值

解析出来的格式为:

多了一个dayTime字段,这样就可以直接渲染在页面上,其他同样日期的都在下面数组中

2.下拉刷新

接下来开始实现下拉刷新功能

a.下拉刷新之前,需要在当前页面配置一个属性

在page.json中当前页面的路由:"enablePullDownRefresh": true

b.一个直接调用刷新的方法
// 下拉刷新的方法,可以直接使用
onPullDownRefresh(){
	this.currentPage = 1   //这个是页码,需要给页码调制第一页
	this.DownloadList = []  //循环的列表制空
	this.wanderNewPage()  //调用类似于从新调用后端接口并且赋值列表的方法
	//停止下拉刷新
	uni.stopPullDownRefresh();  
},
//下载精彩秀页面刷新
		async wanderNewPage(){
			//下载精彩视频列表
			let downInfo = await queryVideoList({
				currentPage: this.currentPage, //页码
				pageSize: 10  //一条多少页
			})
			
			//解析列表
			let newarr = JSON.parse(JSON.stringify(this.DownloadList))
			downInfo.data.data.list.forEach((item,index)=>{
				let i = newarr.findIndex(it => it.daytime === item.createTime.split(' ')[0])
				if (i >= 0) {
					newarr[i].list.push(item)
				} else {
					newarr.push({
						daytime: item.createTime.split(' ')[0],
						list:[item]
					})
				}
				
			})
			console.log(newarr, '=============newarr')
			this.DownloadList = newarr
		},

onPullDownRefresh这个方法是直接使用的,不需要引入

一定要添加停止刷新的方法,uni.stopPullDownRefresh();  否则他就会一直转

3.上拉加载

里面有一个自带的触底事件:onReachBottom

onReachBottom() {
		this.currentPage ++;
		this.wanderNewPage()
},

页面下滑触底之后会直接触发这个事件,然后把页码加一,从新调用方法

好的,以下是一个简单的上拉加载下拉刷新小程序代码: ```html <!-- HTML结构 --> <template> <div class="wrapper"> <div class="pull-down-wrapper"> <div class="pull-down-content">{{pullDownText}}</div> </div> <div class="list-wrapper"> <ul> <li v-for="(item, index) in list" :key="index">{{item}}</li> </ul> <!-- 上拉加载 --> <div class="pull-up-wrapper"> <div class="loading" v-if="isLoading">加载中...</div> <div class="no-more" v-else-if="isNoMore">没有更多了</div> <div class="pull-up-content" v-else>{{pullUpText}}</div> </div> </div> </div> </template> <!-- JS代码 --> <script> export default { data() { return { pullDownText: '下拉刷新', pullUpText: '上拉加载更多', list: [], isLoading: false, isNoMore: false, pullDown: { startY: 0, endY: 0, distance: 0, threshold: 50 }, pullUp: { startY: 0, endY: 0, distance: 0, threshold: 50 } } }, mounted() { // 初始化数据 this.getList() // 监听下拉刷新 this.$refs.listWrapper.addEventListener('touchstart', this.handlePullDownStart) this.$refs.listWrapper.addEventListener('touchmove', this.handlePullDownMove) this.$refs.listWrapper.addEventListener('touchend', this.handlePullDownEnd) // 监听上拉加载 window.addEventListener('scroll', this.handlePullUp) }, beforeDestroy() { // 移除监听 this.$refs.listWrapper.removeEventListener('touchstart', this.handlePullDownStart) this.$refs.listWrapper.removeEventListener('touchmove', this.handlePullDownMove) this.$refs.listWrapper.removeEventListener('touchend', this.handlePullDownEnd) window.removeEventListener('scroll', this.handlePullUp) }, methods: { async getList() { // 发送请求获取数据 this.isLoading = true const res = await axios.get('/api/list') this.isLoading = false // 更新数据 this.list.push(...res.data) // 判断是否还有更多数据 if (res.data.length < 10) { this.isNoMore = true } }, async handlePullDownStart(e) { // 记录开始位置 this.pullDown.startY = e.touches[0].clientY }, async handlePullDownMove(e) { // 计算移动距离 this.pullDown.distance = e.touches[0].clientY - this.pullDown.startY // 如果是向下滑动并且在页面最顶部 if (this.pullDown.distance > 0 && window.pageYOffset === 0) { // 阻止默认事件 e.preventDefault() // 更新下拉刷新状态 this.pullDownContent = this.pullDown.distance >= this.pullDown.threshold ? '松开刷新' : '下拉刷新' } }, async handlePullDownEnd() { // 如果下拉距离超过了阈值 if (this.pullDown.distance >= this.pullDown.threshold) { // 更新下拉刷新状态 this.pullDownContent = '加载中...' // 发送请求获取数据 const res = await axios.get('/api/list') // 更新数据 this.list = res.data } // 重置下拉刷新状态 this.pullDown.distance = 0 this.pullDownContent = '下拉刷新' }, async handlePullUp() { // 如果滚动到了底部 if (window.innerHeight + window.pageYOffset >= document.body.scrollHeight - 50) { // 如果正在加载或者没有更多数据,直接返回 if (this.isLoading || this.isNoMore) { return } // 更新上拉加载状态 this.pullUpText = '加载中...' // 发送请求获取数据 const res = await axios.get('/api/list') // 更新数据 this.list.push(...res.data) // 判断是否还有更多数据 if (res.data.length < 10) { this.isNoMore = true } // 重置上拉加载状态 this.pullUpText = '上拉加载更多' } } } } </script> <!-- 样式 --> <style scoped> .wrapper { height: 100%; display: flex; flex-direction: column; } .pull-down-wrapper { height: 50px; display: flex; justify-content: center; align-items: center; font-size: 14px; color: #999; transform: translate3d(0, -50px, 0); transition: transform 0.3s ease-out; } .pull-down-wrapper.active { transform: translate3d(0, 0, 0); } .list-wrapper { flex: 1; } .pull-up-wrapper { height: 50px; display: flex; justify-content: center; align-items: center; font-size: 14px; color: #999; margin-top: 20px; } </style> ``` 需要注意的是,该代码是基于Vue框架实现的,如果您使用的是其他框架或不使用框架,需要做相应的调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值