
SDKAppID 完成计费统计。npm install @tencentcloud/roomkit-web-react tuikit-atomicx-react @tencentcloud/uikit-base-component-react @tencentcloud/universal-api
pnpm install @tencentcloud/roomkit-web-react tuikit-atomicx-react @tencentcloud/uikit-base-component-react @tencentcloud/universal-api
yarn add @tencentcloud/roomkit-web-react tuikit-atomicx-react @tencentcloud/uikit-base-component-react @tencentcloud/universal-api
import { UIKitProvider } from '@tencentcloud/uikit-base-component-react';import { ConferenceMainView } from '@tencentcloud/roomkit-web-react';export default function App() {return (<UIKitProvider theme="light" language="zh-CN"><ConferenceMainView /></UIKitProvider>);}
conference.login 完成鉴权后,建议同步调用 conference.setSelfInfo 来设置当前用户的展示昵称和头像,这些信息将在随后的参会者视频区域和成员列表中展示。import { useEffect } from 'react';import { conference } from '@tencentcloud/roomkit-web-react';// 注意:以下参数请替换为您真实的业务数据和控制台获取的 SDKAppIDconst SDKAppID = 0;const userId = 'your_user_id';const userSig = 'your_dynamic_user_sig';const userName = '用户展示昵称';function LoginComponent() {useEffect(() => {const init = 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);}};init();}, []);return null;}
conference.login 登录逻辑可能尚未执行。推荐通过 useEffect 监听 loginUserInfo?.userId,该字段非空即视为 TUIRoomKit 登录成功。import { useEffect } from 'react';import { useLoginState } from 'tuikit-atomicx-react/room';import { conference } from '@tencentcloud/roomkit-web-react';function RoomPage() {const { loginUserInfo } = useLoginState();useEffect(() => {if (loginUserInfo?.userId) {conference.createAndJoinRoom({ roomId: '123456' });}}, [loginUserInfo?.userId]);return null;}
conference.createAndJoinRoom 创建并直接进入该房间。import { conference } from '@tencentcloud/roomkit-web-react';const startQuickMeeting = async () => {// 1. 客户端生成一个唯一的 roomIdconst myRoomId = `room_${Date.now()}`;// 2. 建房并直接加入await conference.createAndJoinRoom({roomId: myRoomId,options: {roomName: '我的快速会议',},});};
scheduleRoom 接口提交预定。预定成功后,会议信息将同步至参与者的会议列表中。import { useRoomState } from 'tuikit-atomicx-react/room';function ScheduleDemo() {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);}};return <button onClick={createSchedule}>预约会议</button>;}
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-react';const joinExistingMeeting = async (sharedRoomId: string) => {await conference.joinRoom({roomId: sharedRoomId,});};
useRoomState 提供的 getScheduledRoomList 接口拉取当前用户的预约会议列表,并将其渲染至界面。当用户点击对应会议时,获取该项预约记录对应的 roomId 并调用 conference.joinRoom 即可完成进房操作。import { useState, useEffect } from 'react';import { conference } from '@tencentcloud/roomkit-web-react';import { useRoomState, useLoginState } from 'tuikit-atomicx-react/room';interface RoomInfo {roomId: string;roomName?: string;}export default function ScheduledRoomList() {const { getScheduledRoomList } = useRoomState();const { loginUserInfo } = useLoginState();const [roomList, setRoomList] = useState<RoomInfo[]>([]);// 1. 监听登录状态,确保鉴权就绪后再拉取会议列表useEffect(() => {if (!loginUserInfo?.userId) return;getScheduledRoomList({ cursor: '' }).then(({ scheduledRoomList }) => setRoomList(scheduledRoomList || [])).catch((error) => console.error('获取预约会议列表失败:', error));}, [loginUserInfo?.userId]);// 2. 点击加入房间const handleJoinRoom = async (roomId: string) => {try {await conference.joinRoom({ roomId });} catch (error) {console.error(`加入会议失败 (${roomId}):`, error);}};return (<div><h3>我的预约会议</h3>{roomList.length > 0 ? (<ul style={{ padding: 0, listStyle: 'none' }}>{roomList.map((room) => (<li key={room.roomId} style={{ display: 'flex', justifyContent: 'space-between', padding: '10px', borderBottom: '1px solid #eee' }}><div style={{ display: 'flex', flexDirection: 'column', fontSize: '14px', color: '#666' }}><b style={{ fontSize: '16px', color: '#333' }}>{room.roomName || '未命名会议'}</b><span>房间号: {room.roomId}</span></div><buttononClick={() => handleJoinRoom(room.roomId)}style={{ background: '#006eff', color: '#fff', border: 'none', padding: '6px 12px', borderRadius: '4px', cursor: 'pointer' }}>加入会议</button></li>))}</ul>) : (<div>暂无待参加的预约会议</div>)}</div>);}
roomId,并统一调用 conference.createAndJoinRoom 加入房间。import { conference } from '@tencentcloud/roomkit-web-react';const enterDualMeeting = async (bizOrderId: string) => {// 双方无需判断房间是否已经创建 SDK 内部自动处理建房与进房逻辑await conference.createAndJoinRoom({roomId: bizOrderId,options: {roomName: `业务沟通:${bizOrderId}`,},});};
conference.createAndJoinRoom 接口内部封装了"不存在则创建(成为房主),已存在则加入(成为普通参会者)"的逻辑,完美解决高并发下的状态冲突问题。leaveRoom() 离开会议,调用后不影响其他成员,房间继续存在。import { conference } from '@tencentcloud/roomkit-web-react';await conference.leaveRoom();
endRoom() 后,房间内所有成员均会收到房间已解散的通知。import { conference } from '@tencentcloud/roomkit-web-react';await conference.endRoom();
endRoom() 必须由房主在成功进入房间后才能调用。非房主身份或在尚未进入房间的状态下调用会报错。import { useEffect } from 'react';import { ConferenceMainView, conference, RoomEvent } from '@tencentcloud/roomkit-web-react';export default function MeetingRoom() {useEffect(() => {const backToHome = () => {};const backToLogin = () => {};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);return () => {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);};}, []);return <ConferenceMainView />;}
事件 | 触发时机 | 推荐处理 |
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.tsx 中 UIKitProvider 的入参,修改主题及语言的默认值。UIKitProvider 参数 | 可选值 | 默认值 |
theme | "light" | "dark" | "light" |
language | "zh-CN" | "en-US" | "en-US" |
import { UIKitProvider } from '@tencentcloud/uikit-base-component-react';export default function App() {return (<UIKitProvider theme="light" language="zh-CN">{/* 路由或页面内容 */}</UIKitProvider>);}


conference.setFeatureConfig 更新分享链接。import { conference } from '@tencentcloud/roomkit-web-react';// 在 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-react/room';import { conference } from '@tencentcloud/roomkit-web-react';// 方案一:修改默认视频流布局为侧边栏布局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-react/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-react/scripts/eject.js
./src/components/RoomKit 目录。如您需要自定义拷贝目录请输入 'y', 否则输入'n'。ConferenceMainView 组件及 conference 对象的引用从 npm 包地址更改为 RoomKit 源码的相对路径地址。- import { ConferenceMainView, conference } from '@tencentcloud/roomkit-web-react';// 替换引用路径为 TUIRoomKit 源码的真实路径+ import { ConferenceMainView, conference } from './components/RoomKit/index.ts';
.eslintignore 文件中添加 RoomKit 文件夹忽略 ESLint 检测。// 请替换为 TUIRoomKit 源码真实路径src/components/RoomKit
文档反馈