解决思路:加载上一页聊天记录时先保存当前列表的第一项的id为临时id,关闭滚动动画去加载上一页。加载完后合并两个聊天记录数组再去将当前滚动id设为前面保存的临时id,再打开滚动动画。
<scroll-view class="msg-list" scroll-y="true" :scroll-with-animation="scrollAnimation" :scroll-into-view="scrollToView" @scrolltoupper="loadHistory" upper-threshold="50">
<!-- 此处必须给每一项设置一个id,这里用的是“msg” + id的方式,注意不要用下标 -->
<view class="msg-row" v-for="(row,index) in msgList" :key="index" :id="'msg' + row.id">
......
</view>
</scroll-view>
data:{
page: 1, //加载页码,默认1
scrollAnimation: true, // 开启动画动画
scrollToView: '', // 滚动id
viewId: '', //临时停留id
msgList: [], //消息记录列表
}
监听触顶方法loadHistory,先存储当前消息列表的第一条的id
// 触顶事件
loadHistory: function(){
this.page ++
this.scrollAnimation = false //关闭滚动动画,防止加载完列表concat后乱滚动
this.viewId = this.msgList[0].id //保存此时的id
this.getMsgHistory()
},
// 获取历史聊天记录
getMsgHistory: function() {
this.$api.获取上一页方法().then(
res => {
// 此处已拿到上一页数据,合并数据后设置滚动id再开启滚动动画
this.msgList = res.data.concat(this.msgList)
this.scrollToView = "msg" + this.viewId
this.scrollAnimation = true
}
)
},