

SDKAppID for billing statistics.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, we recommend calling conference.setSelfInfo to set the user’s display name and avatar, which are shown in the participant video area and the member list.import { onMounted } from 'vue';import { conference } from '@tencentcloud/roomkit-web-vue3';// Replace these parameters with your actual business data and SDKAppID from the consoleconst SDKAppID = 0;const userId = 'your_user_id';const userSig = 'your_dynamic_user_sig';const userName = 'Display Name';onMounted(async () => {try {// 1. SDK authenticationawait conference.login({sdkAppId: SDKAppID,userId,userSig,});// 2. (Optional) Set display name and avatarawait conference.setSelfInfo({userName,avatarUrl: 'https://your-avatar-url.com/image.png',});} catch (error) {console.error('TUIRoomKit login failed:', error);}});
conference.login finishes. Use Vue's watch to monitor loginUserInfo.value?.userId. When this value is non-empty, authentication is successful.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 });
import { conference } from '@tencentcloud/roomkit-web-vue3';const startQuickMeeting = async () => {// 1. Generate a unique Room IDconst myRoomId = `room_${Date.now()}`;// 2. Create and Enter Roomawait conference.createAndJoinRoom({roomId: myRoomId,options: {roomName: 'My Quick Meeting',},});};
import { useRoomState } from 'tuikit-atomicx-vue3/room';const { scheduleRoom } = useRoomState();const createSchedule = async () => {try {// Room ID: string, required, recommended to be generated by backend for uniquenessconst roomId = '123456';// Note: Timestamp must be in seconds (Date.getTime() returns milliseconds, divide by 1000)const startTime = Math.floor(new Date().getTime() / 1000) + 3600; // Starts in 1 hourconst duration = 1800; // 30 minutesconst options = {roomName: 'Product Requirement Review',scheduleStartTime: startTime, // unit: secondsscheduleEndTime: startTime + duration, // unit: secondsscheduleAttendees: ['userA', 'userB'], // List of participant IDspassword: '123', // Optional: meeting password};await scheduleRoom({ roomId, options });} catch (error) {console.error('Scheduling failed', error);}};
POST /v4/room_engine_http_srv/create_room{"roomId": "your-room-id","roomName": "Meeting Name","startTime": 1710000000,"endTime": 1710003600,"invitees": ["userId1", "userId2"]}
conference.joinRoom to Enter Room.import { conference } from '@tencentcloud/roomkit-web-vue3';const joinExistingMeeting = async (sharedRoomId: string) => {await conference.joinRoom({roomId: sharedRoomId,});};
getScheduledRoomList API from useRoomState to fetch the user's scheduled meetings and render them. When the user clicks a meeting, retrieve its Room ID and call conference.joinRoom to Enter Room.<template><div><h3>My Scheduled Meetings</h3><ul v-if="roomList.length > 0"><li v-for="room in roomList" :key="room.roomId" class="item"><div class="info"><b>{{ room.roomName || 'Unnamed Meeting' }}</b><span>Room ID: {{ room.roomId }}</span></div><button class="btn" @click="handleJoinRoom(room.roomId)">Join Meeting</button></li></ul><div v-else>No scheduled meetings to join</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. Listen for authentication, fetch meeting list after loginwatch(() => loginUserInfo.value?.userId,async (userId) => {if (userId) {try {roomList.value = await getScheduledRoomList() || [];} catch (error) {console.error('Failed to fetch scheduled meeting list:', error);}}},{ immediate: true });// 2. Join room on clickconst handleJoinRoom = async (roomId: string) => {try {await conference.joinRoom({ roomId });} catch (error) {console.error(`Failed to join meeting (${roomId}):`, error);}};</script><style scoped>/* Minimal base styles */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>
conference.createAndJoinRoom to Enter Room.import { conference } from '@tencentcloud/roomkit-web-vue3';const enterDualMeeting = async (bizOrderId: string) => {// No need to check if room exists; SDK handles creation and Enter Room logic automaticallyawait conference.createAndJoinRoom({roomId: bizOrderId,options: {roomName: `Business Communication: ${bizOrderId}`,},});};
conference.createAndJoinRoom API handles: "If the room does not exist, create it (become host); if it exists, join it (become participant)", resolving state conflicts under high concurrency.leaveRoom() to leave the meeting. This does not affect other members; the room remains active.import { conference } from '@tencentcloud/roomkit-web-vue3';await conference.leaveRoom();
endRoom(), all participants receive a notification that the room has ended.import { conference } from '@tencentcloud/roomkit-web-vue3';await conference.endRoom();
endRoom() must be called by the host after successfully Entered Room. Calling as a non-host or before Enter Room will result in an error.onMounted), and remove listeners when the component unmounts (onUnmounted).<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>
Event | Trigger Timing | Recommended Handling |
RoomEvent.ROOM_DISMISS | Room ended, triggers for all participants | Return to home or meeting list |
RoomEvent.ROOM_LEAVE | User clicks "Leave" button in TUIRoomKit UI | Return to home or meeting list |
RoomEvent.ROOM_ERROR | Enter Room failure or unhandled error in room | Return to home or meeting list |
RoomEvent.KICKED_OUT | Kicked out by host | Return to home or meeting list |
RoomEvent.KICKED_OFFLINE | Same account logged in on another device, current device forced offline | Redirect to login page |
RoomEvent.USER_SIG_EXPIRED | UserSig expired | Redirect to login page |
npm run dev
pnpm run dev
yarn run dev

UIKitProvider parameters in App.vue.UIKitProvider Parameter | Optional Values | Default Value |
theme | "light" | "dark" |
language | "zh-CN" | "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 to update the Room Share Link.import { conference } from '@tencentcloud/roomkit-web-vue3';// Call after conference.createAndJoinRoom or conference.joinRoom succeeds, ensuring Room ID is availableconst roomId = '123456';conference.setFeatureConfig({shareLink: `https://your-domain.com/room?roomId=${roomId}`,});
conference.setFeatureConfig.import { RoomLayoutTemplate } from 'tuikit-atomicx-vue3/room';// Option 1: Set sidebar layout as defaultconference.setFeatureConfig({ layoutTemplate: RoomLayoutTemplate.SidebarLayout });// Option 2: Set top bar layout as defaultconference.setFeatureConfig({ layoutTemplate: RoomLayoutTemplate.CinemaLayout });
conference.endRoom()// Enable microphone, camera, screen sharing, fullscreen permissions<iframe src="https://your-domain.com/index.html" allow="microphone; camera; display-capture; display; fullscreen;">
// Set intranet proxy parameters before Enter Roomimport 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. Enter y to customize the copy directory, otherwise enter n.
- import { ConferenceMainView, ConferenceMainViewH5, conference } from '@tencentcloud/roomkit-web-vue3';// Change import path to the actual TUIRoomKit source path+ import { ConferenceMainView, ConferenceMainViewH5, conference } from './components/RoomKit/index.ts';
.eslintignore to ignore ESLint validation.// Replace with actual TUIRoomKit source pathsrc/components/RoomKit
Was this page helpful?
You can also Contact sales or Submit a Ticket for help.
Help us improve! Rate your documentation experience in 5 mins.
Feedback