跳至主要內容

後座力 0.7

·閱讀時長 3 分鐘

後座力 0.7 提供了一些次要的 API 優化、selector 優化方案和其他的修正。

新功能

原子預設值為選配

現在可以選擇不為原子提供預設值。如果未提供預設值,原子將會維持在「處理中」狀態(例如觸發 React Suspense),直至其被設定。(#1639

這有助於避免尷尬的編碼(例如不必要的將類型標示為可為 Null)或預設值的替代值。以下是一個極簡文字原子的範例

atom<string>({key: 'MyString'});

當原子使用原子效應初始化且預設值並非必要時,這會非常有用

atom({
key: 'MyQuery',
effects: [
dbSyncEffect({query, variables}),
],
});

其他新功能

  • 新增 .getStoreID() 方法至 Snapshot。(#1612
  • 發佈 RecoilLoadable.loading() 工廠用於建立非同步 Loadable,其不會解決。(#1641

優化 / 最佳化

自動保留快照以維持非同步回呼的執行時間長度。

使用 useRecoilCallback() 時,現在不再需要手動保留來自非同步回呼的快照。(#1632

  const myCallback = useRecoilCallback(({snapshot}) => async () => {
// No longer necessary to retain() here
await something;
... use snapshot ...
});

如果你想儲存快照或從排定的其他處理常式狀態中參考它,那麼你仍然需要 手動保留它

其他改進 / 最佳化

  • 最佳化,以隨著更多的選擇器依存關係進行擴充。在有 100 個依存關係時改善 2 倍,在有 1,000 個時改善 4 倍,現在可以支援超過 10,000 個依存關係。(#1651#1515#914
  • 當使用者選擇器實作提供不一致結果時,提供更佳的錯誤回報。(#1696

重大變更

選擇器評估或原子預設值可以使用 Loadable 物件

現在,選擇器 get() 評估回呼或原子 default 屬性可以使用 Loadable 物件。(#1640)這可以讓它們更簡潔地接受同步錯誤狀態

atom({
key: 'Key',
default: RecoilLoadable.error(new Error('ERROR')),
});

或對應的 Loadables 或佔位符

selector({
key: 'Key',
get: ({get}) => {
const queryLoadable = get(noWait(myQuerySelector));
if (queryLoadable.state === 'loading') {
return PLACEHOLDER;
}
return queryLoadable; // Pass on the query results or error state.
}
})

如果你希望明確地評估選擇器值為 PromiseLoadableRecoilState 型態物件,那麼現在你可以用 selector.value()atom.value() 包裝它們。

selector({
key: 'Key',
get: ({get}) => {
// Returns an immediate synchronous value
return selector.value(Promise.resolve('Promise as a value'));
},
});

這只是一個次要變更。它有助於讓 API 更一致以處理包裝器,例如 PromiseLoadable,儘管還未在整個 API 中提供。但是,它有助於預設未來可能明確地將原子和選擇設定為非同步值或錯誤狀態。

其他重大變更

修正

  • 在沒有 Window 介面的 JS 環境中,現在可以凍結開發模式中的使用者值。(#1571
  • 避免在從 onSet() 處理常式呼叫 setSelf() 時,原子效果產生錯誤的控制台錯誤。(#1589#1582