From 3c586f936c088b216966bfbb98a091f2c68a55b1 Mon Sep 17 00:00:00 2001 From: bridge Date: Sat, 20 Dec 2025 21:25:57 +0800 Subject: [PATCH] add event handler auto go down logic --- src/sim/simulator.py | 2 +- web/src/components/panels/EventPanel.vue | 30 ++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/sim/simulator.py b/src/sim/simulator.py index 7275ffd..a30259d 100644 --- a/src/sim/simulator.py +++ b/src/sim/simulator.py @@ -386,7 +386,7 @@ class Simulator: events.extend(await self._phase_execute_actions()) # 4. 关系演化阶段 - await self._phase_evolve_relations() + events.extend(await self._phase_evolve_relations()) # 5. 结算死亡 events.extend(self._phase_resolve_death()) diff --git a/web/src/components/panels/EventPanel.vue b/web/src/components/panels/EventPanel.vue index 8d23c9f..7300617 100644 --- a/web/src/components/panels/EventPanel.vue +++ b/web/src/components/panels/EventPanel.vue @@ -23,14 +23,40 @@ const filteredEvents = computed(() => { return allEvents.filter(event => event.relatedAvatarIds.includes(filterValue.value)) }) -// 自动滚动到底部 +// 智能滚动:仅当用户处于底部时才自动跟随滚动 watch(filteredEvents, () => { + const el = eventListRef.value + if (!el) return + + // 1. scrollHeight === clientHeight: 内容不满一页,无需滚动,视为“在底部”(为了后续满屏时能自动衔接) + // 2. scrollHeight - scrollTop - clientHeight < 20: 内容已满页且当前在最底部 + const isScrollable = el.scrollHeight > el.clientHeight + const isAtBottom = !isScrollable || (el.scrollHeight - el.scrollTop - el.clientHeight < 20) + + if (isAtBottom) { + nextTick(() => { + // 检查DOM元素是否存在(可能在tick期间被销毁) + if (!eventListRef.value) return + + // 重新获取元素,因为DOM可能已经更新 + const updatedEl = eventListRef.value + + // 只有内容确实超出容器时才需要设置 scrollTop + if (updatedEl.scrollHeight > updatedEl.clientHeight) { + updatedEl.scrollTop = updatedEl.scrollHeight + } + }) + } +}, { deep: true }) + +// 切换筛选对象时,强制滚动到底部 +watch(filterValue, () => { nextTick(() => { if (eventListRef.value) { eventListRef.value.scrollTop = eventListRef.value.scrollHeight } }) -}, { deep: true }) +}) const emptyEventMessage = computed(() => ( filterValue.value === 'all' ? '暂无事件' : '该修士暂无事件'