Skip to content

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

Closed

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 消灭的那个缺陷。

参考

Activity

  1. self-assigned this
    on Aug 2, 2026
  2. os-zhuang commented on Aug 2, 2026

    @os-zhuang
    ContributorAuthor

    认领并开工。

    • session: session_01LYnZrTwXbrctB8E8HpJAPT
    • branch: claude/issue-4678-client-react-bulk-hooks

    按正文三条处置:新增 useBulkDataSubscription / useBulkDataSubscriptionCallback;useAutoRefresh 同时订两条流;useDataSubscription / useDataSubscriptionCallback 保持只收逐记录。

    依赖 #4677(subscribeBulkData)。本分支从 origin/main 切出,@objectstack/client 的 subscribeBulkData 尚未合并,因此实现时会对该方法做能力探测(旧 client 上不存在时降级为只订逐记录,并出声),两个 PR 合并顺序不敏感。


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions