<RecoilSync> - Recoil 同步存储
来自 Recoil 同步库 的组件,用于 定义外部存储,以便原子使用 syncEffect()
原子效果与其同步。
function RecoilSync(props: {
storeKey?: string,
read?: ReadItem,
write?: WriteItems,
listen?: ListenToItems,
children: React.Node,
}): React.Node
storeKey
用于匹配哪些原子应该与这个外部存储同步。
读取接口
read()
回调定义如何从外部存储读取项目。当尝试根据外部存储初始化原子值时,会使用它。它也可以从其他复杂映射中调用。
type ReadItem = ItemKey =>
| DefaultValue
| Promise<DefaultValue | mixed>
| Loadable<DefaultValue | mixed>
| mixed;
您可以返回存储中项目的实际值。如果该项目未在存储中设置或不可用,则您可以返回 DefaultValue
。如果需要异步操作才能从存储中读取,还可以返回到该值的异步 Promise
。您还可以提供 Loadable
表示形式,这在需要提供错误状态时很有用。
写入接口
当原子状态被改变时,会调用 write()
回调,这样您就可以定义如何将这些更改写入外部存储。
type ItemDiff = Map<ItemKey, DefaultValue | any>;
type ItemSnapshot = Map<ItemKey, DefaultValue | mixed>;
type WriteItems = ({
diff: ItemDiff,
allItems: ItemSnapshot,
}) => void;
write()
回调提供了一些具名参数
diff
- 项目键及其针对此原子事务已更改的新值的映射。allItems
- 在此存储中使用的所有项目的键和值的映射。
项目的价值可能是 DefaultValue
对象,这意味着该项目应该被重置或删除。如果 syncEffect()
指定 syncDefault
选项,那么将提供实际的默认值而不是 DefaultValue
占位符对象。
监听接口
listen()
回调允许您订阅来自外部存储的异步更新,并改变原子状态以保持同步。
type UpdateItem = <T>(ItemKey, DefaultValue | T) => void;
type UpdateItems = ItemSnapshot => void;
type UpdateAllKnownItems = ItemSnapshot => void;
type ListenToItems = ({
updateItem: UpdateItem,
updateItems: UpdateItems,
updateAllKnownItems: UpdateAllKnownItems,
}) => void | (() => void);
listen()
回调在其参数中提供了一些回调,这些回调允许您将项目更新为新值。任何已从这些项目读取的原子都被“订阅”,并将通过读取已更新的项目来更新其状态。
updateItem()
- 通过提供键和值来更新单个项目的价值。如果该值为DefaultValue
,则它会将该项目重置为默认值。这只会更新单个项目,其他项目不会受到影响。updateItems()
- 通过提供项目键和值的映射来更新多个项目。同样,如果任何项目的价值是DefaultValue
,那么它将重置这些项目。这只会更新提供的项目,其他项目不会受到影响。updateAllKnownItems()
- 通过提供项目键和值的映射来更新多个项目。同样,如果任何项目的价值是DefaultValue
,那么它将重置这些项目。此函数将更新与该存储同步的原子所读取的 所有 已知项目。这意味着,如果项目键未包含在提供的映射中,那么该项目将被重置为默认值。
您可以从 listen()
实现中返回回调处理程序函数,该函数将在存储效果被清除时被调用。这可用于清理对外部存储的订阅。
示例
请参阅 "实现存储" 指南以获取示例。