From 726a8026be0e94a74aa9d983c926ded9f33aa604 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=E6=98=B5=E7=A7=B0=E9=87=8D=E8=A6=81=E5=90=97O?= Date: Sat, 14 Mar 2026 11:19:11 +0800 Subject: [PATCH] =?UTF-8?q?fix(meeting):=20=E8=A7=A3=E5=86=B3=E4=BC=9A?= =?UTF-8?q?=E8=AE=AE=E6=88=BF=E9=97=B4=E5=AD=A6=E7=94=9F=E7=AB=AF=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E7=9B=91=E5=90=AC=E5=99=A8=E5=86=85=E5=AD=98=E6=B3=84?= =?UTF-8?q?=E6=BC=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在离开房间时移除 socket 的 message 事件监听器 - 添加声网客户端事件监听器的清理逻辑 - 确保在房间切换和组件卸载时完全清理所有事件监听器 - 避免重复创建声网客户端实例时保留旧监听器 - 修复了可能造成内存泄漏的事件监听器残留问题 --- .../meeting/meeting-room/meeting-room-student.vue | 14 ++++++++++++++ src/views/meeting/meeting-room/useAgoraMeeting.ts | 3 +-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/views/meeting/meeting-room/meeting-room-student.vue b/src/views/meeting/meeting-room/meeting-room-student.vue index 7bb110d..be357fb 100644 --- a/src/views/meeting/meeting-room/meeting-room-student.vue +++ b/src/views/meeting/meeting-room/meeting-room-student.vue @@ -457,7 +457,14 @@ } isLeaving.value = true; try { + // ✅ 移除所有事件监听器 socket.off('message', onSocketMessage); + + // ✅ 移除声网客户端的事件监听器 + if (meeting.client.value) { + meeting.client.value.removeAllListeners?.(); + } + try { meetingSocket.leaveRoom(socket); } catch {} @@ -663,7 +670,14 @@ if (isLeaving.value) { return; } + // ✅ 移除所有事件监听器 socket.off('message', onSocketMessage); + + // ✅ 移除声网客户端的事件监听器 + if (meeting.client.value) { + meeting.client.value.removeAllListeners?.(); + } + await cleanup(); try { meetingSocket.leaveRoom(socket); diff --git a/src/views/meeting/meeting-room/useAgoraMeeting.ts b/src/views/meeting/meeting-room/useAgoraMeeting.ts index b2c43c1..2da1b6d 100644 --- a/src/views/meeting/meeting-room/useAgoraMeeting.ts +++ b/src/views/meeting/meeting-room/useAgoraMeeting.ts @@ -213,7 +213,7 @@ export function useAgoraMeeting( if (client.value) { client.value.removeAllListeners?.(); } - + client.value = AgoraRTC.createClient({ mode: 'rtc', codec: 'vp8' }); if (tokenManagerRef.value) { tokenManagerRef.value.bindClient(client.value); @@ -223,7 +223,6 @@ export function useAgoraMeeting( * 播放远程视频到指定播放器 * @deprecated 学生端使用 autoPlayRemoteVideo=false,由业务层自行处理 */ - // eslint-disable-next-line @typescript-eslint/no-unused-vars const playRemoteVideo = (user: IAgoraRTCRemoteUser, playerId: string) => { console.log(`【声网】准备播放远程视频 ${playerId}:`, user.uid); setTimeout(() => {