浏览 SDKs · WASM
SDKsWASM

获取会话列表

使用 WASM SDK 分页获取当前用户的会话列表。

复制

会话列表属于当前登录用户。每条 ConversationItem 都包含会话标识、未读数、最后一条消息、置顶和草稿等状态。应使用分页接口读取会话,避免一次加载完整列表。

分页获取会话

使用 getConversationListSplit() 分页获取会话。offset 是起始位置,count 是本页数量;第一页必须从 offset: 0 开始:

参数说明

参数类型是否必填说明
offsetnumber起始偏移量,第一页传 0
countnumber本次读取的会话数量。
const pageSize = 50;

async function loadConversationPage(offset = 0) {
  const { data } = await openimsdk.getConversationListSplit(
    { offset, count: pageSize }
  );

  mergeConversations(data);
  return data;
}

Promise 成功后,data 是当前页的 ConversationItem[]

会话字段

ConversationItem 同时包含聊天目标、列表展示和当前账号的会话设置:

字段类型说明
conversationIDstring会话的稳定 ID,也是列表和事件的合并标识。
conversationTypeSessionType会话类型,例如单聊或群聊。
userIDstring单聊对方的用户 ID;群聊中通常为空。
groupIDstring群聊对应的群组 ID;单聊中通常为空。
showNamestring当前会话的展示名称快照。
faceURLstring当前会话的展示头像快照。
latestMsgstring最后一条消息的序列化内容;为空时表示没有可展示的末条消息。
latestMsgSendTimenumber最后一条消息的发送时间,用于列表排序。
unreadCountnumber当前账号在该会话中的未读消息数。
recvMsgOptMessageReceiveOptType该会话的消息接收与提醒方式。
groupAtTypeGroupAtType群聊中的 @ 提醒状态;单聊不使用。
draftTextstring当前设备保存的会话草稿。
draftTextTimenumber草稿更新时间。
isPinnedboolean会话是否置顶。
isMarkedboolean会话是否已标记,可与会话分组中的“标记”分组配合使用。
isPrivateChatboolean是否启用私聊阅后即焚。
burnDurationnumber私聊阅后即焚时长。
isMsgDestructboolean是否启用定期删除服务端消息。
msgDestructTimenumber服务端消息的定期删除周期。
isNotInGroupboolean当前账号是否已经不在该群组中。
remarkstring(可选)会话备注。
attachedInfostringSDK 附加信息;只按已确认的业务约定解析。
exstring(可选)会话扩展字符串。

列表标题和头像可以直接使用 showNamefaceURL,但好友资料或群资料更新时仍应由对应领域的数据和事件校准。不要根据展示名称生成会话 ID。

继续加载时按已经请求的条目数量推进 offset;合并结果按 conversationID 去重,避免同一会话因查询结果和事件重复进入列表。

当本次返回数量小于 count 时,表示已经到达列表末尾。用户主动刷新时,应清空旧分页状态并从 offset: 0 重新读取;重新登录后的会话变化由会话事件同步。

保持列表同步

getConversationListSplit() 成功后,以返回的 ConversationItem[] 合并当前分页快照;查询本身不应描述为触发会话事件。列表打开期间监听 CbEvents.OnNewConversationCbEvents.OnConversationChanged,两个事件的 data 都是 ConversationItem[],应按 conversationID 合并新增和变化的会话:

import { CbEvents } from '@openim/wasm-client-sdk';

const handleNewConversation = ({ data }) => {
  mergeConversations(data);
};

const handleConversationChanged = ({ data }) => {
  mergeConversations(data);
};

openimsdk.on(CbEvents.OnNewConversation, handleNewConversation);
openimsdk.on(CbEvents.OnConversationChanged, handleConversationChanged);

function removeConversationListListeners() {
  openimsdk.off(CbEvents.OnNewConversation, handleNewConversation);
  openimsdk.off(CbEvents.OnConversationChanged, handleConversationChanged);
}

组件卸载、退出登录或切换账号时调用 removeConversationListListeners()。总未读数由维护总未读数负责,输入状态由上报输入状态负责。

不要用已加入群组列表替代会话列表。用户可能已经加入群组但尚未产生对应会话,也可能退出群组后仍保留历史会话记录。