1
0
Преглед на файлове

[Fix R4-R4-7/8] markdownSafe 注释旧路径更正;useChatScroll 卸载时 cancelAnimationFrame

lizuo преди 2 седмици
родител
ревизия
60c576a4b0
променени са 2 файла, в които са добавени 19 реда и са изтрити 3 реда
  1. 5 2
      src/utils/markdownSafe.ts
  2. 14 1
      src/views/ventAI/manageAssistent/hooks/useChatScroll.ts

+ 5 - 2
src/utils/markdownSafe.ts

@@ -1,7 +1,10 @@
 // [perf-base-v1] 卡6: 公共 Markdown 渲染 + XSS 消毒管线
-// 实现源自 src/views/ventAI/manageAssistent/components/chatModal/utils.ts 的既有消毒配置
+// [审计-第四轮 R4-7] 注释路径更正(纯注释,无行为变化):原注释引用的
+// src/views/ventAI/manageAssistent/components/chatModal/utils.ts 已在本轮上游重构
+// (46df977e)中迁至 src/views/ventAI/manageAssistent/lib/markdown.ts。
+// 实现源自 lib/markdown.ts 的既有消毒配置
 // (marked 渲染 + DOMPurify.sanitize,ADD_TAGS:['img']),迁移为公共 util;
-// ventAI chatModal/utils.ts 转调本文件,避免多处实现漂移。
+// ventAI lib/markdown.ts 转调本文件,避免多处实现漂移。
 // 所有 v-html 绑定的 markdown/HTML 内容必须先经过本模块消毒。
 import { marked } from 'marked';
 import DOMPurify from 'dompurify';

+ 14 - 1
src/views/ventAI/manageAssistent/hooks/useChatScroll.ts

@@ -1,4 +1,4 @@
-import { nextTick } from 'vue';
+import { nextTick, onBeforeUnmount } from 'vue';
 import type ChatMessages from '/@/views/ventAI/manageAssistent/components/chat/ChatMessages.vue';
 
 /**
@@ -30,5 +30,18 @@ export const useChatScroll = (getChatMessages: () => InstanceType<typeof ChatMes
     }
   };
 
+  // [审计-第四轮 R4-8] 卸载时取消挂起的 rAF。
+  // 原行为:scrollRafId 仅在重入时 cancel 自身,组件卸载后不 cancel,残留回调会在卸载后
+  //         再执行一次(内部全 optional chaining,无崩溃、无累积,但无意义)。
+  // 现行为:onBeforeUnmount 里若有挂起 rAF 则 cancel 并复位。
+  // 为什么:定时器/动画帧挂摘对称,消除卸载后的空转回调。
+  // 注:本 composable 仅在组件 setup 内调用(AiAssistantModal),onBeforeUnmount 注册到该组件上。
+  onBeforeUnmount(() => {
+    if (scrollRafId !== null) {
+      cancelAnimationFrame(scrollRafId);
+      scrollRafId = null;
+    }
+  });
+
   return { scrollToBottom, scrollToBottomThrottled };
 };