<RecoilSync> - Recoil 同步儲存
來自 Recoil Sync 程式庫 的元件,用於 定義原子外部的儲存,以 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()
實作中回傳回呼函式控制項,當商店作用已清理完成時,將會呼叫該回呼函式。可用於清理您對外部商店的訂閱。
範例
詳見「實作商店」指南以取得範例。