棋盘回来了,高亮却撒了谎
来源:dev.to — 2026-09-04
📋 概述
作者维护 Codenames AI 网页游戏,每局模式在 localStorage 各存一份存档,重载或切换模式都能恢复。可一旦加入「间谍给出线索时高亮己方卡牌」的功能,切换游戏模式时出了问题:残留的目标点击停留在内存里,只要新模式 25 张卡的棋盘里恰好有一个词和上一模式高亮过的词相同,那张卡就被错误点亮——棋盘是诚实的,UI 却在你根本没点它的情况下说谎。便宜的修复(换板时清高亮)不够,因为它仍假设同局重载应带回点击;真正的分界是语义的而非架构的:哪些是产品已接受为真的状态,哪些只是当下草稿姿态。
🔑 核心要点
- 快照应「持久化领域状态、丢弃草稿姿态」:棋盘、翻开卡、回合、结果、已提交线索历史要恢复,而目标点击、AI 未提交线索、手动计数覆盖要清掉或重新生成
- 残留点击不是样式 bug:它是一份指向某一张具体棋盘的引用,棋盘一变引用就失效——所以「清空那一刻的清白」比「恢复一切」更正确
- 恢复不是把组件曾经知道的全部 rehydrate,而是「恢复游戏、然后清空草稿姿态」;同一份清空逻辑也要在开局与成功提交后跑,防止思考辅助泄漏进下一回合
- AI 生成的未提交线索不该持久:刷新会重新生成(词和目标都可能变),这反而让模型实验、升级或配置变更在下一次重载即生效而非重放旧输出
- 自己打的线索词按 Docs 的方式持久、AI 草稿与目标点击则临时——两者占据相同字段,区分它们的不是 React state vs 领域对象,而是产品是否已接受为真
- 回归测试要抓行为:只在一个棋盘上高亮、离开、回来的单板测试拦不住这个 bug——必须在板 A 高亮、切到仍含同一词的板 B 后断言无任何卡点亮
💡 金句
回来时应恢复的是产品视为当下真相的东西,而不是屏幕上碰巧存在过的东西。
👍 0
👎 0
← 返回 dev.to 首页