跳至主要內容

Recoil 同步程式庫

recoil-sync NPM 套件提供了一個附加程式庫,協助將 Recoil 狀態與外部系統同步。可以透過選擇器或 useEffect() 實作簡單的非同步資料查詢,或使用原子效果雙向同步各別原子。recoil-sync 附加套件提供了一些其他功能

  • 批次處理原子交易 - 可以將多個原子的更新批次處理為與外部系統的單一交易。如果相關原子的狀態一致,這項功能非常重要。
  • 抽象和彈性 - 這個 API 讓使用者可以 separately 說明要同步的原子,並且說明如何同步的機制。這讓元件可以 atomic 且利用不同的系統在不同的環境中同步,而不須變更實作。例如,一個元件可能會使用原子,在當獨立工具中使用時,會儲存在 URL 中;而在另一個工具中嵌入時,會儲存在自訂使用者資料庫中。
  • 驗證和向後相容性 - 在處理來自於外部來源的狀態時,驗證輸入內容非常重要。當狀態是在應用程式的生命週期之後持續保留時,考量狀態前一版本的向後相容性也很重要。 recoil-syncrefine 協助提供這項功能。
  • 原子與外部儲存的複雜對應 - 原子與外部儲存項目之間可能不是一對一對應。原子可能會轉移來使用較新的項目版本,可能會從多個項目中提取 prop,只是一部份複合狀態,或其他複雜對應。
  • 與 React Hook 或 Prop 同步 - 此函式庫可讓原子與無法從原子效果存取的 React Hook 或 Prop 同步。

recoil-sync 函式庫也提供外部儲存的內建實作,例如 與瀏覽器網址同步


基本概念在於,可以將 syncEffect() 新增至每個您想要同步的原子,然後在 <RecoilRoot> 內部新增 <RecoilSync> 來指定如何同步這些原子。您可以使用內建儲存,例如 <RecoilURLSyncJSON>建立自己的,或甚至使用不同的儲存來同步不同群組的原子。

範例

網址持續性

以下是使用 原子與瀏覽器網址同步 的簡單範例

const currentUserState = atom<number>({
key: 'CurrentUser',
default: 0,
effects: [
syncEffect({ refine: number() }),
],
});

然後,在您的應用程式根目錄下,直接包含 <RecoilURLSyncJSON>,以將所有這些標記的原子與網址同步

function MyApp() {
return (
<RecoilRoot>
<RecoilURLSyncJSON location={{part: 'queryParams'}}>
...
</RecoilURLSyncJSON>
</RecoilRoot>
)
}

就是這樣!現在這個原子將在初始載入時,根據網址來初始化其狀態,任何狀態突變都會更新網址,而網址的變更(例如返回按鈕)會更新原子。在 同步效果儲存實作網址持續性 指南中,查看更多範例。

安裝

請参閱 Recoil 安裝指南,並將 recoil-sync 新增為其他相依性。

recoil-sync 還使用 refine 函式庫進行類型精緻化和輸入驗證。