本文对观众列表组件(LiveAudienceList)进行了详细的介绍,您可以在已有项目中直接参考本文示例集成我们开发好的组件,也可以根据您的需求按照文档中的组件定制化部分对样式,布局进行深度的定制。

核心功能
功能分类 | 具体能力 |
实时观众展示 | 实时显示直播间在线观众列表,支持头像、昵称展示,提供清晰的观众信息视图,让主播能够直观了解观众构成。 |
响应式设计 | 组件支持桌面端和移动端两套 UI 方案,自动适配不同设备屏幕尺寸,提供一致的用户体验,满足多平台直播需求。 |
可定制化 UI | 提供灵活的插槽机制,支持自定义观众标记、头像样式等元素,让您能够根据业务需求定制观众列表的展示效果,打造独特的视觉体验。 |
组件接入
步骤1:环境配置及开通服务
步骤2:安装依赖
npm install tuikit-atomicx-vue3 @tencentcloud/uikit-base-component-vue3 --save
pnpm add tuikit-atomicx-vue3 @tencentcloud/uikit-base-component-vue3
yarn add tuikit-atomicx-vue3 @tencentcloud/uikit-base-component-vue3
步骤3:集成观众列表组件
在您的项目中引入并使用观众列表组件,可直接复制如下代码示例至您的项目中展示直播间观众列表。
<template><UIKitProvider theme="dark"><div class="app"><div class="live-audience-container"><LiveAudienceList class="live-audience-list"/></div></div></UIKitProvider></template><script setup lang="ts">import { onMounted } from 'vue';import { UIKitProvider } from '@tencentcloud/uikit-base-component-vue3';import { LiveAudienceList, useLoginState, useLiveListState } from 'tuikit-atomicx-vue3';const { login } = useLoginState();const { joinLive } = useLiveListState();async function initLogin() {try {await login({sdkAppId: 0, // SDKAppID, 可以参考步骤 1 获取userId: '', // UserID, 可以参考步骤 1 获取userSig: '', // userSig, 可以参考步骤 1 获取});} catch (error) {console.error('登录失败:', error);}}onMounted(async () => {await initLogin();await joinLive({liveId: '输入对应直播间 LiveId', // 进入直播间});});</script><style>.live-audience-container{display:flex;height:100%;width:300px;padding:20px}.live-audience-list{width:100%;height:100%}</style>
组件定制化
观众列表组件提供了灵活的组件自定义插槽,该插槽支持您根据自己需求调整观众标记、特殊身份标识等元素的样式与布局。下列分别给出插槽使用示例
组件插槽
名称 | 参数 | 说明 |
audience-mark | audience: AudienceInfo | 自定义观众标记(例如徽章、身份标识等),显示在头像和昵称之间 |
// audience-mark 插槽使用示例<LiveAudienceList><template #audience-mark="{ audience }"><CustomAudienceMark :audience="audience" /></template></LiveAudienceList>
AudienceInfo 定义了直播房间中每个观众的基本信息和状态:参数 | 类型 | 说明 |
userId | string | 观众的唯一标识符,在整个系统中保持唯一性。 |
userName | string | 观众在直播中显示的名称,支持中文、英文等字符,为空时显示 userId。 |
avatarUrl | string | 观众头像的完整 URL 地址,支持 HTTPS 协议。 |
isMessageDisabled | boolean | 观众是否被禁言,true 表示已被禁言,false 表示可以正常发言。 |
joinTime | number | 观众进入直播间的时间戳,用于排序和统计。 |
interface AudienceInfo {userId: string; // 观众唯一标识userName?: string; // 观众显示名称(可选)avatarUrl?: string; // 观众头像URL(可选)isMessageDisabled?: boolean; // 是否被禁言(可选)joinTime?: number; // 进入时间戳(可选)}
组件属性
属性名 | 类型 | 默认值 | 说明 |
height | string | '500px' | 组件高度,支持 CSS 单位(px、%、vh 等)。 |
style | CSSProperties | {} | 自定义样式对象,用于覆盖组件默认样式。 |
自定义插槽示例
为了帮助您更直观地掌握
audience-mark 插槽的定制能力,我们提供了一个综合示例。该示例演示了如何利用 AudienceInfo 数据动态渲染观众标记,具体实现了 VIP 身份高亮(根据 userId 判断)、禁言状态提示(根据 isMessageDisabled 属性)以及通用测试标签的展示。您可以直接复制下方代码,快速实现差异化的观众身份标识逻辑。<template><UIKitProvider theme="dark"><div class="app"><div class="live-audience-container"><LiveAudienceList class="live-audience-list"><template #audience-mark="slotProps"><!-- 始终显示的测试标记 --><div class="custom-mark"><span class="test-badge">TEST</span><span v-if="slotProps.audience && isVip(slotProps.audience.userId)" class="vip-badge">VIP</span><span v-if="slotProps.audience && slotProps.audience.isMessageDisabled" class="muted-badge">🔇</span></div></template></LiveAudienceList></div></div></UIKitProvider></template><script setup lang="ts">import { onMounted } from 'vue';import { UIKitProvider } from '@tencentcloud/uikit-base-component-vue3';import { LiveAudienceList, useLoginState, useLiveListState } from 'tuikit-atomicx-vue3';// 示例:判断是否为 VIP 用户const vipUserIds = ['user_vip_001', 'user_vip_002']; // 添加当前用户ID用于测试const isVip = (userId: string) => {console.log('检查VIP状态:', userId, vipUserIds.includes(userId));return vipUserIds.includes(userId);};const { login } = useLoginState();const { joinLive } = useLiveListState();async function initLogin() {try {await login({sdkAppId: 0, // SDKAppID, 可以参考步骤 1 获取userId: '', // UserID, 可以参考步骤 1 获取userSig: '', // userSig, 可以参考步骤 1 获取});} catch (error) {console.error('登录失败:', error);}}onMounted(async () => {await initLogin();await joinLive({liveId: '输入对应直播间 LiveId', // 进入直播间});});</script><style>.custom-mark{display:flex;align-items:center;gap:4px}.test-badge{background:#666;color:#fff;font-size:10px;font-weight:600;padding:2px 6px;border-radius:4px}.vip-badge{background:linear-gradient(135deg,#ffd700,#ffb347);color:#fff;font-size:10px;font-weight:600;padding:2px 6px;border-radius:4px}.muted-badge{font-size:14px;opacity:.7}.live-audience-container{display:flex;height:100%;width:300px;padding:20px}.live-audience-list{width:100%;height:100%}</style>