在 Twine/Harlowe 中,使用 (link:) 宏会导致链接点击后自动移除;若需实现多次点击、持续可用的交互效果,应改用 (link-rerun:) 宏——它保留链接并重新执行其内容,是解决“点击后链接消失”问题的标准方案。
在 twine/harlowe 中,使用 `(link:)` 宏会导致链接点击后自动移除;若需实现多次点击、持续可用的交互效果,应改用 `(link-rerun:)` 宏——它保留链接并重新执行其内容,是解决“点击后链接消失”问题的标准方案。
默认情况下,Harlowe 的 (link:) 宏设计为一次性交互:用户点击后,宏立即执行其内部动作(如弹出提示、跳转、修改变量),同时将自身从 DOM 中移除——这是其内置行为,并非 Bug,也未在文档中特别强调“会消失”,但属预期机制。
要让链接持久存在、支持反复点击,正确做法是替换为 (link-rerun:) 宏。该宏在触发时不移除自身,而是重新渲染整个宏结构(包括链接文本和内部动作),从而保持界面元素稳定,同时确保每次点击都执行最新状态下的逻辑。
✅ 正确写法(可重复点击):
Thing (link-rerun: "Look at")[(alert: ["It's a thing"], "Sure.")]
⚠️ 注意事项:
- (link-rerun:) 会在每次点击时重新求值其内部表达式,因此若其中包含变量或动态内容(如 (print: $counter)),将反映当前最新值;
- 不要与 (link-goto:) 或 (link-replace:) 混淆:前者跳转至新段落,后者仅替换局部内容且仍会移除原链接;
- 若需配合状态变更(如记录点击次数),可结合变量使用:
(set: $clicks to it + 1)\ Thing (link-rerun: "Look at")[ (alert: ["You've clicked " + $clicks + " times."], "OK") ]
总结:当需求是“点击即响应,但链接常驻”时,(link-rerun:) 是 Harlowe 中唯一语义明确、行为可靠的解决方案。避免尝试通过 CSS 显示/隐藏或 JavaScript 操作 DOM 来“修复”(link:)——这违背 Harlowe 的响应式更新模型,易引发不可预测的渲染问题。











