-
Notifications
You must be signed in to change notification settings - Fork 4
会话列表组件 ConversationList
张东 edited this page Jun 5, 2024
·
1 revision
ConversationList
组件用于展示当前用户的所有会话 (包含单聊和群聊, 但是不包括聊天室),并且提供会话搜索、删除、置顶和免打扰功能。
- 对于单聊, 会话展示的名称为对方昵称,若对方未设置昵称则展示对方的用户 ID,会话头像是对方的头像,如果没有设置则使用默认头像。
- 对于群聊,会话名称为当前群组的名称,头像为默认头像。
import React, { useEffect, useState } from 'react';
import { ConversationList } from 'easemob-chat-uikit';
import 'easemob-chat-uikit/style.css';
const Conversation = () => {
return (
<div style={{ width: '30%', height: '100%' }}>
<ConversationList />
</div>
);
};
如果默认的会话列表页面不能满足需求,你可以使用 ConversationList
组件提供的属性进行自定义。
你可以自定义会话列表区域的背景颜色、大小等样式。
- 对组件添加
className
定义样式。
import React from 'react';
import { ConversationList } from 'easemob-chat-uikit';
import 'easemob-chat-uikit/style.css';
import './index.css';
const Conversation = () => {
return (
<div style={{ width: '30%', height: '100%' }}>
<ConversationList className="conversation" />
</div>
);
};
- 在 index.css 中定义会话 UI 样式:
.conversation {
background-color: '#00bcd4';
height: 100%;
width: 100%;
}
你可以自定义 ConversationList
组件的 header 元素,例如,标题名称为 custom header
。
import React from 'react';
import { ConversationList, Header, Avatar } from 'easemob-chat-uikit';
import 'easemob-chat-uikit/style.css';
const Conversation = () => {
return (
<div style={{ width: '30%', height: '100%' }}>
<ConversationList
renderHeader={() => (
<Header
avatar={<Avatar>D</Avatar>}
content="custom header"
moreAction={{
visible: true,
actions: [
{
content: 'my info',
onClick: () => {
console.log('my info');
},
},
],
}}
/>
)}
></ConversationList>
</div>
);
};
- 使用
renderItem
方法来渲染每个会话条目。 - 使用
ConversationItem
组件的属性自定义组件。
import React from 'react';
import { ConversationList, ConversationItem, Avatar } from 'easemob-chat-uikit';
import 'easemob-chat-uikit/style.css';
import './index.css';
const Conversation = () => {
// 在单聊中,将对端用户的用户 ID 与其用户昵称进行映射。
const idToName = {
userId1: 'name1',
zd2: 'Henry 2',
};
return (
<div style={{ width: '30%', height: '100%' }}>
<ConversationList
className="conversation"
renderItem={cvs => {
return (
<ConversationItem
avatar={
<Avatar
size="normal"
shape="square"
style={{ background: 'yellow', color: 'black' }}
>
{idToName[cvs.conversationId] || cvs.conversationId}
</Avatar>
}
data={{
...cvs,
name: idToName[cvs.conversationId] || cvs.conversationId,
}}
/>
);
}}
></ConversationList>
/>
</div>
);
};
使用 conversationStore
提供的方法,例如:
- 使用
topConversation
方法置顶一个会话。 - 使用
addConversation
方法添加一个会话。
import React from 'react';
import { ConversationList, ConversationItem, rootStore, Button } from 'easemob-chat-uikit';
import 'easemob-chat-uikit/style.css';
const Conversation = () => {
// Pins a conversation.
const topConversation = () => {
rootStore.conversationStore.topConversation({
chatType: 'singleChat', // For group chats, the value is `groupChat`.
conversationId: 'userID', // Enter a conversation ID obtained from your conversation list.
lastMessage: {},
});
};
// Creates a new conversation.
const createConversation = () => {
rootStore.conversationStore.addConversation({
chatType: 'singleChat',
conversationId: 'conversationId',
lastMessage: {},
unreadCount: 3,
});
};
return (
<div style={{ width: '30%', height: '100%' }}>
<ConversationList
renderItem={cvs => {
return (
<ConversationItem
moreAction={{
visible: true,
actions: [
{
// UIKit provides the conversation deletion event by default.
content: 'DELETE',
},
{
content: 'Top Conversation',
onClick: topConversation,
},
],
}}
/>
);
}}
></ConversationList>
<div>
<Button onClick={createConversation}>create conversation</Button>
</div>
</div>
);
};
ConversationList
组件包含以下属性:
参数 | 类型 | 描述 |
className | String | 组件的类名 |
prefix | String | CSS 类名的前缀 |
headerProps | HeaderProps | Header 组件的参数 |
itemProps | ConversationItemProps | ConversationItem 组件的参数 |
renderHeader | () => React.ReactNode | 自定义渲染 Header 组件的方法 |
renderSearch | () => React.ReactNode | 自定义渲染 Search 组件的方法 |
onItemClick | (data: ConversationData[0]) => void | 点击会话列表中每个会话的回调事件 |
onSearch | (e: React.ChangeEvent) => boolean | 搜索输入框的 change 事件,当函数返回 false 时,会组织默认的搜索行为,你可以使用自己的搜索条件来搜索 |