应用内导航到下一个主题后,刚离开的主题中的帖子仍保持渲染状态

我为所有主题(Horizon 主题)启用了嵌套回复,并复现了一个状态错误,该错误在移动端和桌面端均可重现。

当我打开一个主题,阅读后通过“建议/相关主题”区块跳转到另一个主题(即客户端导航,无页面刷新)时,我刚离开的那个主题的回复有时会残留在屏幕上——被渲染为嵌套在新主题的第一个分支下。它们甚至可能附着在新主题中已被删除的帖子下。继续跳转到更多主题也无法清除该问题,只有完全刷新页面才能解决。

一个重要细节:该问题具有间歇性。首次通过相关区块跳转通常正常,我可以多次点击该区块而不出问题。似乎只有在连续通过“相关主题”区块跳转两次或更多次后,问题才会出现。

复现步骤:

  1. 打开一个包含嵌套回复的主题。
  2. 通过“建议/相关主题”区块打开另一个主题(无页面刷新),并连续重复此操作几次。
  3. 在通过该区块连续跳转两次或更多次后,之前主题的回复会嵌套出现在当前主题的第一个分支下,有时甚至附着在该主题中已被删除的帖子下。
  4. 这些残留回复会在后续的站内导航中持续存在,直到进行硬刷新。

控制台没有 JavaScript 错误,因此我查看了网络(Network)标签页,发现之前的主题似乎从未被正确清理:

  • 检查的页面是主题 724(/n/vibriruet-pri-troganii…/724?sort=old)。
  • 当我处于主题 724 时,网络日志中仍显示对之前主题数据的请求:509.json?sort=old&track_visit=true。
  • 实时消息总线(message-bus)轮询的 Referer 仍为 …/n/pinki-tolchki-…-na-nissane-kube/509,即主题 509 的消息总线订阅从未被重新指向主题 724。

因此,问题似乎在于:在客户端导航时,嵌套路由未能重置来源主题的帖子流(post stream)或消息总线订阅。该问题最初在移动端发现,但在桌面端表现一致。

Discourse 版本:2026.6.0-latest (27f76aa897)
如果需要,我很乐意提供屏幕录制或进一步排查。

3 个赞

@Andry_Osminin 这个问题仅出现在 Horizon 主题中,还是在 Foundation 中也是一样的?

我目前还无法很好地复现,不过已@markvanlan 来协助查看可视化问题。

2 个赞

它仅在 Horizon 上复现——在 Foundation 上,我没有看到回复分支在主题之间延续。

但我不认为它只是单纯在 Foundation 上缺失;看起来这更多与那里的导航机制有关。我注意到的区别如下:

  • Horizon:当我点击相关主题(或从列表中打开任意主题)时,主题会立即显示,没有任何加载指示器。这种即时导航正是分支延续出现的时候,通常在连续点击 2 次以上后发生。
  • Foundation:主题最初也会立即显示(与 Horizon 相同),但在约 200-400 毫秒后,会出现带有动画圆点的加载屏幕,主题会重新加载——这意味着在快速打开后,会立即触发第二次自我加载。

因此,该问题似乎特定于“即时”导航而暴露出来,因为前一个主题的状态未被重置。而在 Foundation 上,随后的加载显然会重置状态并掩盖了该问题。换句话说:在 Horizon 上,即时嵌套主题导航不会重置前一个主题的帖子流/消息总线订阅,而 Foundation 的流程则通过第二次加载完成这一操作。

另外,在 Horizon 上测试时发现:在嵌套视图中,我偶尔会遇到微小的布局偏移。我打开一个主题并开始向下滚动,当屏幕滚动到回复区域时,可能会发生快速的微小偏移——并非每次都会出现,但频率较高。这可能与上述问题相关,也可能是一个独立的小问题;特此标记以备参考。

2 个赞

还有一个我遇到的次要问题——不确定是嵌套模式还是 Horizon 特有的,但在扁平模式下并未出现:在一种边缘情况下,主题统计行的布局不正确。当主题的用户数过少而无法显示“用户”计数,且未显示阅读时间时,浏览量计数器会换行到单独一行,并以不同的颜色渲染,而不是采用带有数字的正常样式统计块。截图 1:正常情况。截图 2:边缘情况。如果您希望将错误分开处理,我很乐意将此问题单独开一个主题。

1 个赞

我认为我找到了解决您 Horizon 问题的办法。我将在即将发布的 PR 中包含该修复,该 PR 将对移动端的嵌套主题视图产生较大影响。希望能今天发布。

3 个赞

非常感谢你这么快就着手处理!我在 #40548(“修复嵌套帖子注册的清理”)中找到了修复方案,并看到该 PR 仍处于草稿状态,所以完全不用着急。

只是想确认一下——大概什么时候能合并?如果方便的话,我很乐意在准备好后在我的实例上进行测试。

1 个赞

嘿,Andry,

我已将该修复纳入正在进行的更大规模的移动端用户体验重构中。目前我正在做最后的 QA 测试,以确保不会意外破坏任何功能。希望今天或明天能完成合并。

1 个赞

已合并该 PR :+1: 更新后请告诉我情况是否良好。我没有忘记 views 标签的奇怪格式问题,稍后会处理。

2 个赞

感谢提交 #40652!我现在使用的是包含 #40652 的 2f2676180 版本,已完整重新构建 ./launcher 应用,并在无痕模式下进行了检查,因此可以排除缓存问题。不过,内容延续的问题依然存在。

我的复现步骤如下(排序方式为“最早优先”):第一个分支及其下的两条回复总会延续到下一个主题中,并显示在该主题的第一个分支下,前提是我在不重新加载页面的情况下切换主题。完全刷新页面后该问题会消失。

一个不相关的想法(并非 bug):当某人回复自己的帖子时,或许不必再增加一级嵌套,而是直接将其放在同一层级下方。有些应用就是这样处理的,这样可以防止讨论串变得过深。仅供参考。

好的,再来一次:FIX: prevent nested reply children leaking between topics on Horizon by markvanlan · Pull Request #40687 · discourse/discourse · GitHub

请告诉我效果如何。感谢你们的反馈!

3 个赞

已更新并测试——运行完美,话题之间不再出现串漏 :tada: 。非常感谢!现在我可以全论坛推出嵌套回复功能了。

2 个赞

此问题已在以下提交中修复:FIX: Avoid single stat layout for nested topic maps (#40744) · discourse/discourse@fc64d05 · GitHub

再次感谢你的报告!