跳转到内容

批处理

batch() 把一组写入视为一次事务,最终只发出合并后的通知。

  • 本质:通知层合并,不改变最终状态结果。
  • 影响:减少重复渲染、减少 patch 噪音。
  • 适用:一次交互内多个字段联动更新。
  • 表单提交后同时更新数据与 UI 标志位。
  • 列表操作涉及多个路径写入。
  • 需要保证订阅回调只触发一次“最终态”。
import { batch, io } from '@iostore/store';
const store = io({ count: 0, user: { name: 'Ada' } });
batch(() => {
store.count.set((v) => v + 1);
store.user.name.set('Lin');
});
import { batch, io } from '@iostore/store';
const store = io({ a: 0, b: 0 });
store.subscribe((value) => {
console.log('value', value);
});
batch(() => {
store.a.set(1);
store.b.set(2);
});
// 仅一次订阅通知:{ a: 1, b: 2 }
  • subscribe:合并值通知。
  • subscribeUpdate:合并 patch 更新(内部 merge)。
  • 把无关交互硬塞进同一个 batch:会降低调试可读性。
  • 误以为 batch 会改变写入顺序:它合并通知,不重排语义。
  • 高频离散写入不做批处理:会产生可避免的渲染抖动。
  • 以“一个用户动作 = 一个 batch”作为默认粒度。
  • 多字段写入优先批处理,再做性能调优。
  • 需要可读性更强的结构化写入时,可考虑 commit