根因:删除动作没有跨过组件边界,不是"画布不刷新"
PdfReader.tsx 的 onSidebarDelete() 只做三件事:把父级 annRecords 里那条过滤掉 → savePdfAnnotations() 落库 → toast「已删除批注」。
但阅读区里那条勾画,是每一页自己持有的一份状态画出来的(PdfAnnotationCanvas 的 annotations),
而这份状态只在 attachmentId / pageIndex 变化时才重新加载:
// PdfAnnotationCanvas.tsx
useEffect(() => { /* loadPage(attachmentId, pageIndex) */ }, [attachmentId, pageIndex]);
⇒ 删除只改了「父级的清单 + 服务端记录」,页内那份快照没变,画布继续按旧快照画;
顶部工具栏的「批注数」同理要等下一次刷新才更新。所以现象正好是你看到的:侧栏立刻没了,阅读区还在。
已修(分支,基于 dev)
分支 fix/pdf-sidebar-delete-refresh(已推)。做法与既有的「侧栏点击跳转」完全同形
——一次性 target + 消费回调,只有页码匹配的那一页消费它:
| 文件 | 改动 |
|---|---|
PdfReader.tsx |
onSidebarDelete() 在 setAnnRecords(updated) 之后 setDeleteTarget({ pageIndex, annId }),并透传给页块 → 画布 |
PdfAnnotationCanvas.tsx |
新增一条 effect 消费它:用已有的、被单测覆盖的纯函数 removeAnnotation()(src/lib/pdfAnnotation.test.ts 的 "annotation CRUD")把该条从本页状态里去掉,并清掉选中态;计数由既有的 [annotations, …] effect 自动刷新 |
判据(本机)
npx tsc --noEmit→ exit 0- 全量 vitest → 1315 passed / 1 failed;那 1 条是
scripts/check-crypto-backend.test.mjs在 Windows 上的既有失败
(把工作区 stash 回纯dev后同样红:expected 'C:\home\tester\shuyonote-target' to be '/home/tester/shuyonote-target'
—— 门禁自测拿 POSIX 绝对路径去喂path.resolve),与本改动无关。
⚠️ 真机 UI 复验没做:这一条(画笔勾画 → 侧栏删除 → 阅读区也立刻消失)需要能开 app 的机器点一遍,
我这台机器跑不了 Tauri UI。要按你们的复验流程走,我可以补;或者你直接在 1.91.9 上验。
基线说明
线上 1.91.9 在 main、此修复基于 dev;这两个文件在 dev 与 main 之间逐字节相同
(git diff origin/dev origin/main -- src/components/PdfReader.tsx src/components/PdfAnnotationCanvas.tsx 为空),
所以修法对两条线都成立。要不要 cherry-pick 到 main 做小版本热修,由你定。
issue 先不关:还没合入 dev / 发版。


已随 v1.91.10 发布 —— 这条关闭
修复已合入 dev → main 并完成发版(pnpm check:release-state 21/21 通过)。
改了什么是这样:侧栏删除批注后,除了更新父级清单与落库,还会**通知「那一页」**把这条从页内状态里去掉 —— 阅读区不再残留那条勾画,顶部工具栏的计数同时跟上。实现复用已被单测覆盖的纯函数 removeAnnotation,没有另写一份过滤逻辑。
判据:npx tsc --noEmit 0 错;全量 vitest 1315 通过 / 1 失败(那 1 条是 scripts/check-crypto-backend.test.mjs 在 Windows 上的既有失败,把工作区 stash 回纯 dev 后同样红,与本改动无关);通道自检 21/21。
⚠️ 如实说明一条边界:真机 UI 复验我这边做不了(本机跑不了 Tauri UI)——"点一下:勾画 → 侧栏删除 → 阅读区也立刻消失"这步请你在 1.91.10 上确认。若还有残留,把复现步骤贴回来我继续查。


版本 / 平台
复现步骤
点击画笔按钮,然后在阅读区勾画;然后在右侧栏点击按钮删除。
期望
勾画在侧边栏和阅读区同时没有
实际
侧边栏的没了,阅读区还有。