跳至主要内容

<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() 实现中返回回调处理程序函数,该函数将在存储效果被清除时被调用。这可用于清理对外部存储的订阅。

示例

请参阅 "实现存储" 指南以获取示例。