在 Twine 2 与 Harlowe 中,通过 (link:) 宏生成的链接默认具有“一次性”特性——点击后执行命令的同时链接自身会消失。若希望链接能够被反复点击并持续触发(例如多次弹窗),则应改用 (link-rerun:) 宏。
在 Twine 2 + Harlowe 环境下,使用 `(link:)` 宏创建的链接,默认行为是“单次触发”——点击后,宏执行完内部命令便会自动从页面中移除。若希望链接能够像“常驻”按钮一样,反复点击而不会消失,并能持续触发交互,则需要使用 `(link-rerun:)` 宏。
许多初次接触 Harlowe 的开发者,常会对 `(link:)` 点击后自动消失的行为感到困惑。实际上,这恰是它的设计目的——用于实现单次导航或一次性的交互动作。因此,其内部机制包含两个步骤:执行括号内的命令,以及将该链接元素从页面中移除。你看到的“点击后消失”并非 bug,而是有意为之的功能特性。
那么,如何让链接在点击后依然保留?解决方案是使用 `(link-rerun:)` 宏。其语法与 `(link:)` 完全相同,但语义截然不同。它仅执行内部命令,同时保留链接元素,不会触发页面跳转,也不会重新渲染整个段落,而是像一个小型插件一样,在原地响应交互。
✅ 正确的写法示例如下:
Thing (link-rerun: "Look at")[(alert: ["It's a thing"], "Sure.")]
⚠️ 使用时有几点需要注意:
- `(link-rerun:)` 不会刷新段落或重载变量,因此非常适合用于轻量级交互,例如弹出提示、计数、状态切换等。
- 如果希望在点击后更新文本内容,例如显示“已查看 3 次”,可以结合 `$(count)` 变量与自增运算来实现。
- 避免在 `(link-rerun:)` 中放置耗时操作或大量 DOM 修改,否则可能导致响应延迟。
- 同一个交互逻辑,不要混用 `(link:)` 和 `(link-rerun:)`,以免混淆语义,增加后期维护难度。
? 再分享一个小技巧:若希望添加视觉反馈,例如点击后变色,可以结合 CSS 类与 `enchant` 宏来动态添加样式。但核心的交互逻辑,仍需依靠 `(link-rerun:)` 来确保可持续触发。
