

SDKAppID 完成计费统计。npm install @tencentcloud/roomkit-web-vue3@5 tuikit-atomicx-vue3 @tencentcloud/uikit-base-component-vue3 @tencentcloud/universal-api
pnpm install @tencentcloud/roomkit-web-vue3@5 tuikit-atomicx-vue3 @tencentcloud/uikit-base-component-vue3 @tencentcloud/universal-api
yarn add @tencentcloud/roomkit-web-vue3@5 tuikit-atomicx-vue3 @tencentcloud/uikit-base-component-vue3 @tencentcloud/universal-api
<template><UIKitProvider theme="light" language="zh-CN"><ConferenceMainView v-if="isPC"></ConferenceMainView><ConferenceMainViewH5 v-else></ConferenceMainViewH5></UIKitProvider></template><script setup lang="ts">import { ref } from 'vue';import { UIKitProvider } from '@tencentcloud/uikit-base-component-vue3';import { ConferenceMainView, ConferenceMainViewH5 } from '@tencentcloud/roomkit-web-vue3';import { getPlatform } from '@tencentcloud/universal-api';const isPC = ref(getPlatform() === 'pc');</script>
conference.login 完成鉴权后,建议同步调用 conference.setSelfInfo 来设置当前用户的展示昵称和头像,这些信息将在随后的参会者视频区域和成员列表中展示。import { onMounted } from 'vue';import { conference } from '@tencentcloud/roomkit-web-vue3';// 注意:以下参数请替换为您真实的业务数据和控制台获取的 SDKAppIDconst SDKAppID = 0;const userId = 'your_user_id';const userSig = 'your_dynamic_user_sig';const userName = '用户展示昵称';onMounted(async () => {try {// 1. 执行 SDK 登录await conference.login({sdkAppId: SDKAppID,userId,userSig,});// 2. (可选)设置个人信息await conference.setSelfInfo({userName,avatarUrl: 'https://your-avatar-url.com/image.png',});} catch (error) {console.error('TUIRoomKit 登录失败:', error);}});
conference.login 登录逻辑可能尚未执行。推荐通过 watch 监听 loginUserInfo.value?.userId,该字段非空即视为 TUIRoomKit 登录成功。import { watch } from 'vue';import { useLoginState } from 'tuikit-atomicx-vue3/room';import { conference } from '@tencentcloud/roomkit-web-vue3';const { loginUserInfo } = useLoginState();watch(() => loginUserInfo.value?.userId, async (userId) => {if (userId) {await conference.createAndJoinRoom({ roomId: '123456' });}}, { immediate: true });
conference.createAndJoinRoom 创建并直接进入该房间。import { conference } from '@tencentcloud/roomkit-web-vue3';const startQuickMeeting = async () => {// 1. 客户端生成一个唯一的 roomIdconst myRoomId = `room_${Date.now()}`;// 2. 建房并直接加入await conference.createAndJoinRoom({roomId: myRoomId,options: {roomName: '我的快速会议',},});};
scheduleRoom 接口提交预定。预定成功后,会议信息将同步至参与者的会议列表中。import { useRoomState } from 'tuikit-atomicx-vue3/room';const { scheduleRoom } = useRoomState();const createSchedule = async () => {try {// roomId 限制:字符串类型,必传参数,建议由业务后台生成保证 roomId 唯一性。const roomId = '123456';// 注意:时间戳单位必须为 **秒** (Date.getTime() 获取的是毫秒,需除以 1000)const startTime = Math.floor(new Date().getTime() / 1000) + 3600; // 1小时后开始const duration = 1800; // 30分钟const options = {roomName: '产品需求评审会',scheduleStartTime: startTime, // 单位:秒scheduleEndTime: startTime + duration, // 单位:秒scheduleAttendees: ['userA', 'userB'], // 邀请参会成员ID列表password: '123', // 可选:设置入会密码};await scheduleRoom({ roomId, options });} catch (error) {console.error('预定失败', error);}};
POST /v4/room_engine_http_srv/create_room{"roomId": "your-room-id","roomName": "会议名称","startTime": 1710000000,"endTime": 1710003600,"invitees": ["userId1", "userId2"]}
roomId 后,仅需调用 conference.joinRoom 即可加入房间。import { conference } from '@tencentcloud/roomkit-web-vue3';const joinExistingMeeting = async (sharedRoomId: string) => {await conference.joinRoom({roomId: sharedRoomId,});};
useRoomState 提供的 getScheduledRoomList 接口拉取当前用户的预约会议列表,并将其渲染至界面。当用户点击对应会议时,获取该项预约记录对应的 roomId 并调用 conference.joinRoom 即可完成进房操作。<template><div><h3>我的预约会议</h3><ul v-if="roomList.length > 0"><li v-for="room in roomList" :key="room.roomId" class="item"><div class="info"><b>{{ room.roomName || '未命名会议' }}</b><span>房间号: {{ room.roomId }}</span></div><button class="btn" @click="handleJoinRoom(room.roomId)">加入会议</button></li></ul><div v-else>暂无待参加的预约会议</div></div></template><script setup lang="ts">import { ref, watch } from 'vue';import { conference } from '@tencentcloud/roomkit-web-vue3';import { useRoomState, useLoginState } from 'tuikit-atomicx-vue3/room';const { getScheduledRoomList } = useRoomState();const { loginUserInfo } = useLoginState();const roomList = ref<any[]>([]);// 1. 监听登录状态,确保鉴权就绪后再拉取会议列表watch(() => loginUserInfo.value?.userId,async (userId) => {if (userId) {try {roomList.value = await getScheduledRoomList() || [];} catch (error) {console.error('获取预约会议列表失败:', error);}}},{ immediate: true });// 2. 点击加入房间const handleJoinRoom = async (roomId: string) => {try {await conference.joinRoom({ roomId });} catch (error) {console.error(`加入会议失败 (${roomId}):`, error);}};</script><style scoped>/* 极简基础样式 */ul { padding: 0; list-style: none; }.item { display: flex; justify-content: space-between; padding: 10px; border-bottom: 1px solid #eee; }.info { display: flex; flex-direction: column; font-size: 14px; color: #666; }.info b { font-size: 16px; color: #333; }.btn { background: #006eff; color: #fff; border: none; padding: 6px 12px; border-radius: 4px; cursor: pointer; }</style>
roomId,并统一调用 conference.createAndJoinRoom 加入房间。import { conference } from '@tencentcloud/roomkit-web-vue3';const enterDualMeeting = async (bizOrderId: string) => {// 双方无需判断房间是否已经创建 SDK 内部自动处理建房与进房逻辑await conference.createAndJoinRoom({roomId: bizOrderId,options: {roomName: `业务沟通:${bizOrderId}`,},});};
conference.createAndJoinRoom 接口内部封装了“不存在则创建(成为房主),已存在则加入(成为普通参会者)”的逻辑,解决高并发下的状态冲突问题。leaveRoom() 离开会议,调用后不影响其他成员,房间继续存在。import { conference } from '@tencentcloud/roomkit-web-vue3';await conference.leaveRoom();
endRoom() 后,房间内所有成员均会收到房间已解散的通知。import { conference } from '@tencentcloud/roomkit-web-vue3';await conference.endRoom();
endRoom() 必须由房主在成功进入房间后才能调用。非房主身份或在尚未进入房间的状态下调用会报错。<template><ConferenceMainView></ConferenceMainView></template><script setup lang="ts">import { ref, onMounted, onUnmounted } from 'vue';import { ConferenceMainView, conference, RoomEvent } from '@tencentcloud/roomkit-web-vue3';const backToHome = () => {};const backToLogin = () => {};onMounted(() => {conference.on(RoomEvent.ROOM_DISMISS, backToHome);conference.on(RoomEvent.ROOM_LEAVE, backToHome);conference.on(RoomEvent.ROOM_ERROR, backToHome);conference.on(RoomEvent.KICKED_OUT, backToHome);conference.on(RoomEvent.KICKED_OFFLINE, backToLogin);conference.on(RoomEvent.USER_SIG_EXPIRED, backToLogin);});onUnmounted(() => {conference.off(RoomEvent.ROOM_DISMISS, backToHome);conference.off(RoomEvent.ROOM_LEAVE, backToHome);conference.off(RoomEvent.ROOM_ERROR, backToHome);conference.off(RoomEvent.KICKED_OUT, backToHome);conference.off(RoomEvent.KICKED_OFFLINE, backToLogin);conference.off(RoomEvent.USER_SIG_EXPIRED, backToLogin);});</script>
事件 | 触发时机 | 推荐处理 |
RoomEvent.ROOM_DISMISS | 房间被解散,对所有成员触发。 | 返回首页或会议列表 |
RoomEvent.ROOM_LEAVE | 用户点击 TUIRoomKit 界面上的「离开」按钮。 | 返回首页或会议列表 |
RoomEvent.ROOM_ERROR | 进房失败或房间内发生未处理的错误。 | 返回首页或会议列表 |
RoomEvent.KICKED_OUT | 被房主踢出房间。 | 返回首页或会议列表 |
RoomEvent.KICKED_OFFLINE | 同一账号在其他设备登录,当前设备被强制下线。 | 跳转登录页 |
RoomEvent.USER_SIG_EXPIRED | UserSig 已过期。 | 跳转登录页 |
npm run dev
pnpm run dev
yarn run dev

App.vue 中 UIKitProvider 的入参,修改主题及语言的默认值。UIKitProvider 参数 | 可选值 | 默认值 |
theme | "light" | "dark" | "light" |
language | "zh-CN" | "en-US" | "en-US" |
<UIKitProvider theme="light" language="zh-CN"><router-view /></UIKitProvider><script setup lang="ts">import { UIKitProvider } from '@tencentcloud/uikit-base-component-vue3';


conference.setFeatureConfig 更新分享链接。import { conference } from '@tencentcloud/roomkit-web-vue3';// 在 conference.createAndJoinRoom / conference.joinRoom 成功之后立即调用,确保 roomId 已知const roomId = '123456';conference.setFeatureConfig({shareLink: `https://your-domain.com/room?roomId=${roomId}`,});
conference.setFeatureConfig 修改默认视频布局。import { RoomLayoutTemplate } from 'tuikit-atomicx-vue3/room';// 方案一:修改默认视频流布局为侧边栏布局conference.setFeatureConfig({ layoutTemplate: RoomLayoutTemplate.SidebarLayout });// 方案二:修改默认视频流布局为顶部栏布局conference.setFeatureConfig({ layoutTemplate: RoomLayoutTemplate.CinemaLayout });
conference.endRoom() 方法;// 开启麦克风、摄像头、屏幕分享、全屏权限<iframe src="https://your-domain.com/index.html" allow="microphone; camera; display-capture; display; fullscreen;">
// 请在进房前设置内网代理参数import TUIRoomEngine from '@tencentcloud/tuiroom-engine-js';import { useRoomEngine } from 'tuikit-atomicx-vue3/room';const { roomEngine } = useRoomEngine();TUIRoomEngine.once('ready', () => {const trtcCloud = roomEngine.instance?.getTRTCCloud();trtcCloud.callExperimentalAPI(JSON.stringify({api: 'setNetworkProxy',params: {websocketProxy: "wss://proxy.example.com/ws/",turnServer: [{url: '14.3.3.3:3478',username: 'turn',credential: 'turn',}],iceTransportPolicy: 'relay',},}));});
./src/components/RoomKitnode ./node_modules/@tencentcloud/roomkit-web-vue3/scripts/eject.js
./src/components/RoomKit 目录。如您需要自定义拷贝目录请输入 y, 否则输入 n。
- import { ConferenceMainView, ConferenceMainViewH5, conference } from '@tencentcloud/roomkit-web-vue3';// 替换引用路径为 TUIRoomKit 源码的真实路径+ import { ConferenceMainView, ConferenceMainViewH5, conference } from './components/RoomKit/index.ts';
.eslintignore 文件中添加 RoomKit 文件夹忽略 ESLint 检测。// 请替换为 TUIRoomKit 源码真实路径src/components/RoomKit
文档反馈