说明
我这边用小程序集成im,然后结合公司的需求,做了一个聊天的小程序,在测试上线的时候没有问题,结果到客户那边,因为他们聊天的人多,会话列表达到了300多条,然后点击会话列表,进入聊天页面,会卡顿。下图是测试环境的
尝试解决
因为我在im原有基础上,增加了很多遍历逻辑,im保存的用户信息较少,所以先获取会话列表,然后根据imid,去自己数据库查询用户信息,如果数据过多,先去调用接口,然后再将信息重新遍历设置到列表,所以我以为是这种代码造成的卡顿,结果把这些代码去掉以后,还是卡顿
发现问题
将那些逻辑遍历之类的代码去掉,发现列表第一次点击,不卡顿,第二次再点击,卡顿,所以我以为是会话页面的资源没有释放,然后我在返回的时候各种释放,类似于这样
但是呢,没效果。后来就在想,一样的代码,为什么长列表就会卡顿,然后在看文档的时候,发现了一个专门针对长列表的解决组件,试了一下,快了很多
recycle-view
要严格按照文档来集成,我就是因为少了一个配置,报错,以为是环境的问题,差点放弃
解决
按照文档集成recycle-view,把相关代码贴一下
布局代码
<view class="conversation-list-area">
<!-- <scroll-view class="scoll-view" scroll-y="true"> -->
<recycle-view batch="{{batchSetRecycleData}}" id="recycleId">
<recycle-item wx:for="{{recycleList}}" wx:key="id">
<ConversationItem wx:key="index" id="{{item.conversationID}}" data-type="{{item.type}}" conversation="{{item}}" bindtap="handleRoute" statusList="{{statusList}}" bind:transCheckID="transCheckID" charge="{{transChenckID===item.conversationID}}" wx:if="{{item.type!='@TIM#SYSTEM'}}" bind:updateLocalConversationList="updateLocalConversationList" data-type="{{item.type}}">
</ConversationItem>
</recycle-item>
</recycle-view>
<!-- </scroll-view> -->
</view>
js代码
ready() {
wx.$TUIKit.on(wx.$TUIKitTIM.EVENT.MESSAGE_RECEIVED, this.$onMessageReceived, this);
ctx = createRecycleContext({
id: 'recycleId',
dataKey: 'recycleList',
page: this,
itemSize: { // 这个参数也可以直接传下面定义的this.itemSizeFunc函数
height: this.rpx2px(150),
width: this.rpx2px(750)
}
})
},
...
rpx2px(rpxNum) {
return rpxNum * app.globalData.rpx2px;
},
app.js设置
onLaunch: function () {
wx.getSystemInfo({
success: e => {
// 设计稿一般是 750 rpx, 但是 canvas 是 px;
// 1rpx 转换成 px 的时候
this.globalData.rpx2px = 1 / 750 * e.windowWidth;
}
});
.....
}
globalData: {
....
rpx2px:0,
}
定义一个方法,用于数据的更新或者添加
updateRecylerView(dataList) {
wx.hideLoading()
if(dataList.length==0){
ctx.splice(0, 99999);
ctx.forceUpdate()
return
}
if (ctx.getList() == null || ctx.getList().length == 0) {
ctx.append(dataList)
} else {
if(ctx.getList().length!=dataList.length){
ctx.splice(0, 99999);
ctx.append(dataList)
}else{
ctx.update(0, dataList);
ctx.forceUpdate()
}
}
},
因为在使用的过程中,发现不同的数据,比如现在页面上是有数据的,然后刷新以后没有数据,调用ctx.update(0, dataList),竟然没更新,所以对各种情况进行了适配
其他优化
我用小程序自带的工具进行了测评,可以测出一些不易发现的问题,比如后台没有对图片大小进行限制,竟然有将近0.5m大小的图片,如果这样的图片多了,占用资源也会很多,当然很卡
大家在开发小程序的时候,如果涉及到列表,在预期的将来,会有很多数据的情况下(可以本地用遍历赋值,制造大量数据测试),还是使用长列表,如果没那么多,用普通列表就可以了,在开发完以后,可以用上述的工具进行评分,会给出哪些问题需要优化