跳转到内容

原生使用

本页适合你在不依赖 UI 框架时,直接把 IO 作为状态内核使用。

  • Node 脚本、工具链、SDK 内部状态。
  • 自定义渲染器或已有事件系统。
  • 先验证状态模型,再接入前端框架。

安装相关依赖(任选一种包管理工具):

Terminal window
npm i @iostore/store
import { io } from '@iostore/store';
const store = io({ count: 0 });
const stop = store.count.subscribe((value) => {
console.log('render', value);
});
store.count.set(1);
stop();
  • get():读当前值。
  • set(next | updater):写入新值。
  • snapshot():获取冻结快照(适合断言/序列化)。
// 值订阅
const stopValue = store.count.subscribe((value) => {
console.log('value', value);
});
// 更新订阅(patch)
const stopUpdate = store.subscribeUpdate((update) => {
console.log(update.patches);
});

当同一动作包含多次写入时,建议使用 batch()

import { batch } from '@iostore/store';
batch(() => {
store.count.set(1);
store.count.set(2);
});
能力API说明
创建状态io(initial)创建根 Scope。
读取当前值unit.get()读取 Unit 的即时值。
写入状态`unit.set(nextupdater)`
值订阅unit.subscribe(listener)监听某一路径值变化。
更新订阅scope.subscribeUpdate(listener)监听 patch 级更新流。
冻结快照scope.snapshot()适合边界传输与测试断言。
合并写入batch(fn)合并多次写入,减少中间通知。
// 错误:只订阅根节点,任何字段变化都触发
const stop = store.subscribe((v) => console.log(v));
// 推荐:按路径订阅,只关注需要的字段
const stopCount = store.count.subscribe((v) => console.log(v));
// 错误:多次离散写入,触发多次通知
store.count.set(1);
store.count.set(2);
// 推荐:用 batch 合并通知
batch(() => {
store.count.set(1);
store.count.set(2);
});
  • 只订阅根节点导致回调过于频繁:优先订阅路径 Unit。
  • 忘记调用退订函数:可能出现重复回调。
  • 多次离散写入不批处理:会增加不必要通知。
  • 优先用 snapshot() 做边界输出和测试断言。
  • 读写密集场景先设计订阅粒度,再优化性能。
  • 把“状态演进”与“副作用执行”拆分,便于维护。