#4639 实施(PR #4677)的范围内发现,按第十条军规立案。 ## 现象 #4677 给谓词写(`multi: true`)加了聚合事件契约,并在 `@objectstack/client` 上开了 `subscribeBulkData(object, cb)`。但 `@objectstack/client-react` 没有跟上: `packages/client-react/src/realtime-hooks.tsx` 里三个 hook 全部委托 `client.events.subscribeData`(`:94`、`:183`),没有任何一个订阅 `data.records.*`: - `useDataSubscription` (`:84`) - `useDataSubscriptionCallback` (`:173`) - `useAutoRefresh` (`:251`) 于是 React 用户拿不到批量写事件 —— client SDK 有这个能力,hooks 层没暴露。 ## 最刺眼的是 `useAutoRefresh` 它的语义就是"数据变了就重取"。而谓词写恰恰是**最该重取**的场景 —— 一次改掉/删掉 40 行,列表页整页都脏了。现在它对此完全不刷新,而对单条记录改动反而会刷。 这不是性能取舍,是语义漏洞:一个叫 "auto refresh" 的 hook 在数据变化最大的那次写入上静默不动。 ## 处置方向 1. 新增 `useBulkDataSubscription`(和 `useBulkDataSubscriptionCallback`,如果要与现有成对结构保持一致),委托 `subscribeBulkData`; 2. **`useAutoRefresh` 同时订两条流** —— 逐记录和批量都触发重取。它的返回值是刷新信号,不是事件体,所以两种事件在这里天然同构,不存在 #4639 里那个"形状不同不能混"的问题(那条约束针对的是把 `BulkDataEvent` 交给 `(event: DataEvent) => void` 回调,`useAutoRefresh` 不暴露事件体); 3. `useDataSubscription` / `useDataSubscriptionCallback` **保持只收逐记录** —— 它们的回调签名是 `DataEvent`,混进来就是 #4626 消灭的那个缺陷。 ## 参考 - #4639 / PR #4677 —— 批量事件契约 - `packages/client/src/realtime-api.ts` —— `subscribeBulkData` 的边界校验写法 - `packages/client-react/src/realtime-hooks.tsx`
Activity
os-zhuang commentedon Aug 2, 2026
认领并开工。
session_01LYnZrTwXbrctB8E8HpJAPTclaude/issue-4678-client-react-bulk-hooks按正文三条处置:新增
useBulkDataSubscription/useBulkDataSubscriptionCallback;useAutoRefresh同时订两条流;useDataSubscription/useDataSubscriptionCallback保持只收逐记录。依赖 #4677(
subscribeBulkData)。本分支从origin/main切出,@objectstack/client的subscribeBulkData尚未合并,因此实现时会对该方法做能力探测(旧 client 上不存在时降级为只订逐记录,并出声),两个 PR 合并顺序不敏感。Generated by Claude Code
feat(client-react): bulk-write hooks, and useAutoRefresh refreshes on…
test(client-react): give the package a test harness and pin realtime …
fix(client-react): stop five hooks from looping on dependency identity (