任务看板示例让列表、选中任务的详情和完成统计各自订阅同一个任务查询。它展示 UI 可以交给 cacheq 管理的逻辑:共享加载、请求状态、失败后保留旧数据和刷新通知。
独立示例模块使用 Bubble Tea v2,需要 Go 1.26 及以上版本;核心库仍支持 Go 1.22。示例使用内存后端,无需外部服务或凭证。
git clone https://github.com/Waterkyuu/cacheq.gitcd cacheq/examples/bubbleteago run .初次加载完成后,三个视图显示同一数据集,后端加载次数为一次。每次刷新只增加一次后端加载,与订阅数量无关。本地读取包含可取消的 750 ms 延时,便于观察加载状态。
| 按键 | 操作 |
|---|---|
j / 向下、k / 向上 |
选择任务,不触发加载 |
| 空格 / 回车 | 切换后端选中任务的完成状态,并使查询失效 |
r |
使查询失效并刷新 |
f |
将下一次后端读取设为单次失败,并刷新 |
q / ctrl+c |
关闭订阅并退出 |
共享查询正在加载时,修改和刷新操作会被忽略。
| 文件 | 职责 |
|---|---|
| main.go | 持有客户端和终端程序,在退出或启动失败时清理资源 |
| model.go | 为各视图建立订阅,在消息循环中处理快照 |
| store.go | 持有可变任务数据,通过可取消的读取返回副本 |
数据与资源归属
Section titled “数据与资源归属”应用持有一个客户端,在退出时关闭它。每个视图各自持有键为 "tasks" 的 QueryHandle[[]task],程序结束时释放订阅。所有加载函数都表示同一个数据集;详情和统计从共享结果中读取选中记录和完成数量。
本地后端持有可变的任务切片,读取时返回副本,缓存中的切片作为只读数据使用。选择任务只改变界面状态,不触发加载。这个小型数据集不需要为每条任务详情建立独立查询。
消息循环集成
Section titled “消息循环集成”每个视图安排一个等待下一条 Updates() 通知的命令。消息同时携带视图标识和快照。Update 保存快照,然后为同一视图安排下一次等待。
命令不修改界面模型。所有显示状态的修改都发生在 Bubble Tea 的串行消息循环中。通知保存初始状态和最新快照,慢消费者可能跳过中间阶段。三个视图通过独立消息收到同一次结果,消息处理期间可能短暂显示不同阶段。
空格或回车先修改本地后端的选中记录,再调用 client.Invalidate("tasks")。失效操作将共享数据标记为过期,并启动一次有订阅者的刷新。列表、详情和统计在刷新副本到达前保留原有数据。
示例的本地修改很短,采用同步调用。真实的 HTTP 或数据库修改应放进 tea.Cmd,完成后向 Update 发送消息,只有修改成功才使缓存失效。如果相关数据使用不同键,必须显式使所有受影响的键失效;cacheq 不会推断数据集之间的关系。
f 注入一次后端读取失败并刷新。三个视图都在失败时保留原有任务,下一次按 r 即可恢复。演示不自动重试这次失败,让错误状态持续可见。
退出先关闭所有订阅以释放等待中的命令,再由应用关闭客户端,取消共享工作。终端启动失败采用同样的清理路径。单独关闭一个句柄不会取消由客户端持有的加载。
在 examples/bubbletea 目录运行:
go vet ./...go test -race ./... -count=1go build -o /tmp/cacheq-bubbletea .消息循环测试通过 channel 控制加载,并检查三个视图收到的通知。覆盖请求共享、修改、失败保留数据、恢复和取消,不依赖演示中的真实时间延迟。
