在前端小程序开发中,列表页是用户交互的核心部分之一。为了提高用户体验和页面响应速度,实现列表的滚动加载(也称为“无限滚动”或“懒加载”)功能显得尤为重要。本篇文章将详细介绍如何在小程序中实现这一功能,并提供一些优化建议。

一、功能概述
滚动加载是一种用户在浏览列表时,当滚动到页面底部自动加载更多数据的技术。这种技术可以减少初次加载的数据量,加快页面加载速度,同时按需加载数据,减轻服务器压力。
二、准备工作
- 选择合适的开发框架:本例中使用 Vue.js 作为开发框架,因为它具有良好的组件化特性和丰富的生态。
 - UI组件库:使用 uView UI 组件库,它提供了丰富的组件和简便的使用方法。
 
三、滚动加载组件实现
模板部分
首先,我们需要创建一个基本的列表页面模板。以下是使用 uView UI 组件库的示例代码
<view class="order-list">
	<u-list height="100%" lowerThreshold="30" :preLoadScreen="page.current * 4" @scrolltolower="scrolltolower">
        <u-empty v-if="messageList.length == 0 && noMoreData !== 'loadmore'" text="暂无数据" mode="list" marginTop="100"></u-empty>
		<view v-for="(item, index) in messageList" :key="index">
			<view class="content-list">列表内容</view>
		</view>
		<u-loadmore :status="noMoreData" :nomore-text="nomoreText" />
		<view style="width: 100%; height: 20rpx; margin-top: 20rpx; background-color: transparent"></view>
	</u-list>
</view> 
脚本部分
在 Vue 的 data 函数中初始化状态;在 onShow 生命周期钩子中初始化数据加载;通过监听 scrolltolower 事件来加载更多数据
<script>
import { getMessageList } from '@/api/message.js';
export default {
	data() {
		return {
			page: {
				current: 1,
				size: 10
			},
			noMoreData: 'loadmore',
			nomoreText: '实在没有了',
			messageList: [],        
		}
	},
	onShow() {
		this.page.current = 1
		this.getMessageData();
	},
	methods: {
		scrolltolower() {
			if (this.noMoreData !== 'loadmore') {
				return;
			}
			this.page.current++;
			this.getMessageData(true);
		},
		getMessageData(srcoll) {
			let input = {
				...this.page,
			};
			this.noMoreData = 'loading';
			// 调用接口
			getMessageList(input).then((res) => {
				if (res.code == 200) {
					const newData = res.data.records;
					// ... 拿到接口数据进行处理加载
				}
			});
		},
	}
}
</script>
 
样式
使用 SCSS 为列表添加样式
<style lang="scss" scoped>
    .order-list {
	    height: calc(100vh - 320rpx);
	    margin: 0 auto;
	    .content-list {
	        width: 95%;
	        margin: 0 auto;
	        height: 100rpx;
	        display: flex;
	    }
	}
</style> 
完整代码示例
<view class="order-list">
	<u-list height="100%" lowerThreshold="30" :preLoadScreen="page.current * 4" @scrolltolower="scrolltolower">
               <u-empty v-if="messageList.length == 0 && noMoreData !== 'loadmore'" text="暂无数据" mode="list" marginTop="100"></u-empty>
		<view v-for="(item, index) in messageList" :key="index">
			<view class="content-list">列表内容</view>
		</view>
		<u-loadmore :status="noMoreData" :nomore-text="nomoreText" />
		<view style="width: 100%; height: 20rpx; margin-top: 20rpx; background-color: transparent"></view>
	</u-list>
</view>
 
<script>
import { getMessageList } from '@/api/message.js';
export default {
	data() {
		return {
			page: {
				current: 1,
				size: 10
			},
			noMoreData: 'loadmore',
			nomoreText: '实在没有了',
			messageList: [],        
		}
	},
	onShow() {
	    this.page.current = 1
	    this.getMessageData();
	},
	methods: {
	    scrolltolower() {
	        if (this.noMoreData !== 'loadmore') {
	            return;
	        }
	        this.page.current++;
	        this.getMessageData(true);
	    },
	    getMessageData(srcoll) {
	        let input = {
	            ...this.page,
	        };
	        this.noMoreData = 'loading';
	        getMessageList(input).then((res) => {
	            console.log(res, '消息列表返回值打印');
	            if (res.code == 200) {
	                const newData = res.data.records;
	                if (newData && newData.length > 0) {
	                    if (srcoll) {
	                        this.messageList = this.messageList.concat(newData);
	                        this.noMoreData = 'loadmore';
	                    } else {
                                                        // 这个长度值根据实际开发内容列表来定 
					       // 这个是判断页面首次加载接口列表数据就6条的时候是否到页面底部了,到底部就就不可能继续滚动了显示'nomore'
	                        if (newData.length > 6) {
	                            this.noMoreData = 'loadmore';
	                        } else {
	                            this.noMoreData = 'nomore';
	                        }
	                        this.messageList = newData;
	                    }
	                } else {
	                    this.noMoreData = 'nomore';
	                    if (srcoll) {
	                        this.page.current--;
	                    }
	                }
	            }
	        });
	    },
	}
}
</script>
<style lang="scss" scoped>
	.order-list {
	    height: calc(100vh - 320rpx);
	    margin: 0 auto;
	    .content-list {
	        width: 95%;
	        margin: 0 auto;
	        height: 100rpx;
	        display: flex;
	    }
	}
</style> 
四、总结
滚动加载功能是提升小程序用户体验的重要手段之一。通过合理设计数据加载逻辑和界面提示,可以使小程序的列表页更加流畅和友好。希望本篇文章能够帮助你在小程序开发中实现这一功能,并提供一些实用的优化建议。


















