소스 검색

refactor(student): 重构消息存储结构为 Map 以优化更新性能

将消息存储从 Yjs Array 改为 Map 结构,通过设置 latest 键存储单条消息,替代原有的清空数组再推送的操作,减少数据变更次数,提升同步性能。
lsc 2 주 전
부모
커밋
c2730c9915
1개의 변경된 파일과 13개의 추가작업 그리고 15개의 파일을 삭제
  1. 13 15
      src/views/Student/index.vue

+ 13 - 15
src/views/Student/index.vue

@@ -1494,10 +1494,10 @@ const clearAllSyncStates = () => {
     if (props.type == '1' && isCreator.value && docSocket.value) {
       console.log('🧹 创建老师退出,清空所有同步状态')
       docSocket.value.transact(() => {
-        // 清空普通消息
-        const messageArray = docSocket.value?.getArray?.('message')
-        if (messageArray) {
-          messageArray.delete(0, messageArray.length)
+        // 清空普通消息(Map 结构)
+        const messageMap = docSocket.value?.getMap?.('message')
+        if (messageMap) {
+          messageMap.delete('latest')
         }
         // 清空计时器消息数组
         const timerMessagesArray = docSocket.value?.getArray?.('timerMessages')
@@ -3214,18 +3214,17 @@ const messageInit = () => {
 
   // 初始化普通消息数组(只保留最后一条)
   if (!yMessage.value) {
-    console.log('初始化普通消息数组')
-    yMessage.value = docSocket.value.getArray('message')
+    console.log('初始化普通消息Map')
+    yMessage.value = docSocket.value.getMap('message')
     yMessage.value.observe((e: any) => {
-      e.changes.added.forEach((i: any) => {
-        console.log('yMessage', yMessage.value.length)
-        console.log('yMessage', yMessage.value)
-        const message = i.content.getContent()[0]
+      // Map 的 observe 事件中 keysChanged 包含被更新的 key
+      if (e.keysChanged.has('latest')) {
+        const message = yMessage.value.get('latest')
         console.log('yMessage', message)
-        if (message.mId !== mId.value) {
+        if (message && message.mId !== mId.value) {
           getMessages(message)
         }
-      })
+      }
     })
   }
 
@@ -3619,9 +3618,8 @@ const sendMessage = (obj: any) => {
     else {
       // 普通消息:只保留最后一条
       if (yMessage.value) {
-        // 清空数组,只保留新消息
-        yMessage.value.delete(0, yMessage.value.length)
-        yMessage.value.push([message])
+        // 用 Map.set 代替 Array.delete+push,只产生 1 条 update
+        yMessage.value.set('latest', message)
       }
     }
   })