原理就是正常向下加载更多加上flex的column-reverse;倒过来变成向上拉无感丝滑加载更多历史消息,适合聊天类历史消息查询,微信等就是采用这种方式,效果如下:
我们以uniapp实现,可以转换成微信小程序的代码的,代码如下:
点击查看完整代码
<template> <scroll-view :scroll-top="scrollTop" class="chat-container " scroll-y="true" @scroll="onScroll" ref="chatContainer"> <view class="message-list" > <view v-for="(message, index) in messages" :key="index" class="message-item"> <text>{{ message }}</text> </view> <view class="space" :style="'height:'+spaceheight+'px;'"></view> </view> </scroll-view> </template> <script> export default { data() { return { spaceheight:1000,//预留高度,用与无缝向上滚动 pagesize:20,//,每一页大小 scrollTop:0, messages: [], // 当前的消息列表 page: 1, // 当前加载的页数 isLoading: false, // 是否正在加载 }; }, onLoad() { // 初次加载 this.initData(); }, methods: { async initData(){ var that=this; let newMessages=[]; for(let i =1; i <= that.pagesize; i ++) { newMessages.push( `消息 第${this.page }页,第${i }条`); } // 将新的消息添加到现有消息的开头 this.messages = newMessages; this.page=this.page+1; this.$nextTick(function(){ that.scrollTop=1200; }) }, // 加载更多历史消息 async loadMoreMessages() { if (this.isLoading) return; this.isLoading = true; var that=this; // 模拟异步请求,实际应用中替换成API调用 setTimeout(() => { if(that.page>=10){ that.spaceheight=0; uni.showToast({ title:"没有更多了", icon:"none" }) return; } let newMessages=[]; for(let i =1; i <= that.pagesize; i ++) { newMessages.push( `消息 第${that.page}页,第${i}条`); } // 将新的消息添加到现有消息的开头 that.messages = [ ...that.messages,...newMessages]; that.page += 1; that.isLoading = false; }, 400); }, // 滚动事件监听 onScroll(event) { const { scrollTop } = event.detail; console.log(scrollTop) if (scrollTop <1200 && !this.isLoading) { // 触发上拉加载 this.loadMoreMessages(); } }, }, }; </script> <style> .chat-container { background-color: ghostwhite; height: 60vh; /* 让容器撑满屏幕高度 */ overflow-y: auto; /* 开启滚动 */ } .message-list { display: flex; flex-direction: column-reverse; } .message-item { padding: 10px; background-color: #f0f0f0; margin-bottom: 10px; border-radius: 5px; } </style>
网友回复