From a97788e7c922d281ccbaca4daa28f2369a1eeefb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=8B=E6=9D=B0?= Date: Mon, 18 Aug 2025 17:15:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=83=85=E7=BB=AA=E5=A4=A7=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E9=99=90=E5=88=B6=E5=8F=AA=E5=9C=A8=E6=90=9C=E7=B4=A2=E8=82=A1?= =?UTF-8?q?=E7=A5=A8=E5=AE=8C=E6=88=90=E5=90=8E=E6=BB=9A=E5=8A=A8=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/AiEmotion.vue | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/views/AiEmotion.vue b/src/views/AiEmotion.vue index c3f3fb3..8c25099 100644 --- a/src/views/AiEmotion.vue +++ b/src/views/AiEmotion.vue @@ -587,6 +587,8 @@ const addStock = (stockData) => { // 设置为历史记录模式,并重置用户主动搜索标志 isHistoryMode.value = true; isUserInitiated.value = false; + // 历史记录恢复场景,不启用自动滚动 + shouldEnableAutoScroll.value = false; // 1. 先清空页面显示节点和stockList中的数据 isPageLoaded.value = false; // 隐藏页面显示节点 @@ -666,6 +668,7 @@ const hasTriggeredAudio = ref(false); // 是否已触发音频播放 const hasTriggeredTypewriter = ref(false); // 是否已触发打字机效果 const intersectionObserver = ref(null); // 存储observer实例 const isUserInitiated = ref(false); // 标记是否为用户主动搜索 +const shouldEnableAutoScroll = ref(false); // 标记是否应该启动自动滚动(仅在搜索新数据成功后为true) // 打字机效果相关的变量已移除,现在直接使用parsedConclusion显示内容 @@ -2202,6 +2205,8 @@ async function handleSendMessage(input, onComplete) { messages.value = []; // 清空已添加股票的记录,避免重复添加 addedStocks.value.clear(); + // 搜索新数据成功,启用自动滚动 + shouldEnableAutoScroll.value = true; // 启动页面高度监听器,实时监听内容变化并自动滚动 startHeightObserver(); // 立即滚动到底部 @@ -2323,6 +2328,8 @@ async function handleSendMessage(input, onComplete) { // 使用nextTick确保DOM更新后清空对话显示并启动高度监听器 nextTick(() => { messages.value = []; + // 搜索失败恢复场景,不启用自动滚动 + shouldEnableAutoScroll.value = false; // 启动页面高度监听器,实时监听内容变化并自动滚动 startHeightObserver(); // 立即滚动到底部 @@ -2410,6 +2417,8 @@ async function fetchData(code, market, stockName, queryText, stockId) { // 使用nextTick确保DOM更新后清空对话显示并启动高度监听器 nextTick(() => { messages.value = []; + // 数据验证失败恢复场景,不启用自动滚动 + shouldEnableAutoScroll.value = false; // 启动页面高度监听器,实时监听内容变化并自动滚动 startHeightObserver(); // 立即滚动到底部 @@ -2468,6 +2477,8 @@ async function fetchData(code, market, stockName, queryText, stockId) { // 使用nextTick确保DOM更新后清空对话显示并启动高度监听器 nextTick(() => { messages.value = []; + // API请求失败恢复场景,不启用自动滚动 + shouldEnableAutoScroll.value = false; // 启动页面高度监听器,实时监听内容变化并自动滚动 startHeightObserver(); // 立即滚动到底部 @@ -2510,6 +2521,8 @@ async function fetchData(code, market, stockName, queryText, stockId) { // 使用nextTick确保DOM更新后清空对话显示并启动高度监听器 nextTick(() => { messages.value = []; + // 网络异常恢复场景,不启用自动滚动 + shouldEnableAutoScroll.value = false; // 启动页面高度监听器,实时监听内容变化并自动滚动 startHeightObserver(); // 立即滚动到底部 @@ -3011,6 +3024,12 @@ const startHeightObserver = () => { // 先停止之前的监听器 stopHeightObserver(); + // 只有在应该启用自动滚动时才启动监听器 + if (!shouldEnableAutoScroll.value) { + console.log("跳过启动自动滚动监听器:非搜索新数据场景"); + return; + } + isAutoScrollEnabled.value = true; // 创建ResizeObserver监听页面内容变化 @@ -3219,6 +3238,8 @@ onMounted(async () => { // 使用nextTick确保DOM更新后清空对话显示并启动高度监听器 nextTick(() => { messages.value = []; + // 组件挂载时恢复数据场景,不启用自动滚动 + shouldEnableAutoScroll.value = false; // 启动页面高度监听器,实时监听内容变化并自动滚动 startHeightObserver(); // 立即滚动到底部