@baukit/preferences-core
@baukit/preferences-core 定义输入的首选项及其更新行为。 产品提供
定义、存储适配器,以及变化引起的任何影响.
更新模式
每个定义都提供密钥、默认值、规范度和范围。 水利读取商店, 实现每个存储字段的常态化,并填入其定义中遗漏的字段.
默认 optimistic 模式使本地更新立即可见,然后将其作为补丁写入.
如果写入失败,控制器会恢复之前的可见值并记录出错.
这仍然是兼容性的默认值 .
设定 updateMode: "serialized" 当每次更新必须从最新承诺值开始时:
const controller = createPreferenceController({
definitions,
store,
updateMode: 'serialized',
onVisibleChange: (values) => renderPreferences(values),
});
串行模式一次运行一个补丁. 它保持承诺值在写入时可见
待定和返回 SerializedPreferenceControllerState 从 getState()。 。 pendingCount
包括活动写入和每个队列写入. onVisibleChange 当计数时, 也运行
更改,即使数值参数没有改变。 无法写入的已承诺值
不变。 下个补丁仍然运行并使用上一个成功的结果.
打电话 switchIdentity 当认证对象改变时, 将使用下一个身份存储 。 这个
控制器在开始新读取前会发布默认值 。 慢读或写旧的
身份无法将身份的偏好恢复到可见状态
属于被替换身份的副作用失败不会降落在新的身份上.
打电话 stop() 当任何拥有的 onVisibleChange 离开,比如反应提供者
卸载。 飞行中的工作仍未结束 getState() 保持准确; 回调刚刚停止
开火 在序列化模式下,排队的写作在不出版的情况下继续反对被捕获的商店
之后 stop()消费者不需要自己的挂旗 onVisibleChange。 。 。 .
一个身份切换器取消了为旧身份所写的队列 。 已经寄给旧的书信 存储可以结算,但它不能发布值,也不能针对新存储启动已排队的旧补丁. 已取消的队列更新和对当前飞行中成功的 stale 更新解析 身份的价值观。 一个失败的飞行商店呼叫仍然以存储错误拒绝.
电线编码器通过检查有效载荷是否拥有一个场来区分出三个状态:
- 缺席意味着一个更古老的同位素没有发送设置,所以没有补丁;
- 无效是指同伴明确清除了一个无效的设置;
- 值包含设置的解码值.
可选的 TypeScript 属性本身并不带有这种区分.
副作用命令
默认政策是 after-persistence。 区域变化、许可提示、提醒
重新排期、分析变化和网络清空功能只应在本地
写入成功 。 每个钩子都声明 onError: "report" | "ignore"。报告的效果错误将保留
在控制状态下,持续和明显的偏好保持不变.
一些视觉变化需要即时预览. 定义可以选择采用
preview-with-rollback,提供预览操作,并提供倒数。 控制器
如果预览或持久性失败,则运行回滚。 其可选 afterPersistence 钩子还在
只在写完之后运行.
移徙
现有的呼叫者不需要改变. 没有电话 updateMode 仍然使用乐观的能见度
并且可能会有重叠的商店写作。 目前保持自己写队列的呼叫者可以
设定 updateMode: "serialized"读取 pendingCount 从 getState(),并删除队列。 他们
UI在等待更新时必须期望承诺的能见度.
储存适配器测试
实施适应器 PreferenceStore.read 财务报告和审定财务报表 PreferenceStore.patch导入
describePreferenceStoreContract 从 @baukit/preferences-core/vitest 运行共享的虚拟
合同。 该子路径仅为无害环境管理,没有 default 条件,所以杰斯特不能解决它.
InMemoryPreferenceStore 适合测试和小的流程中消费者.
RepositoryPreferenceStore (或 createRepositoryPreferenceStore) 调整一个按键的寄存器
主题 id, 即大多数产品已经存储设置行的方式 。 给它存放
和两项预测:
const store = createRepositoryPreferenceStore({
repository: repositories.settings,
subjectId: userId,
toValues: (record) => ({ mode: record.theme, accent: record.accent_color }),
toRecordPatch: (patch) => ({
...(patch.mode === undefined ? {} : { theme: patch.mode }),
...(patch.accent === undefined ? {} : { accent_color: patch.accent }),
}),
});
toRecordPatch 必须省去补丁没有携带的密钥,所以一个未触动的首选项永远不会
写回. read 决定: undefined 当仓库返回时 null 或者说 undefined 页:1
主题,也就是使控制器回到定义默认值.
边界
此软件包不会生成 SQL 、 选择存储计划、 运行迁移或设置 接口。 产品仍然决定存在哪些偏好,每个范围存储在哪里,哪些用户 以及同步有效载荷如何到达服务器.