Skip to content

client-react 拿不到批量写事件:useAutoRefresh 对 multi:true 不刷新,三个 realtime hook 都没有 subscribeBulkData 的对应物 #4678

Description

@os-zhuang

#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 同时订两条流 —— 逐记录和批量都触发重取。它的返回值是刷新信号,不是事件体,所以两种事件在这里天然同构,不存在 declared ≠ enforced:引擎 multi:true 谓词写入没有 data.record.* 事件,webhook / 知识同步对其静默(REST 批量端点不受影响) #4639 里那个"形状不同不能混"的问题(那条约束针对的是把 BulkDataEvent 交给 (event: DataEvent) => void 回调,useAutoRefresh 不暴露事件体);
  3. useDataSubscription / useDataSubscriptionCallback 保持只收逐记录 —— 它们的回调签名是 DataEvent,混进来就是 client realtime declared ≠ enforced:subscribeData 回调把 RealtimeEventPayload 硬铸成 DataEvent,顶层 recordId/changes/id 运行时是 undefined #4626 消灭的那个缺陷。

参考

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions