後座力 0.7 提供了一些次要的 API 優化、selector 優化方案和其他的修正。
新功能
原子預設值為選配
現在可以選擇不為原子提供預設值。如果未提供預設值,原子將會維持在「處理中」狀態(例如觸發 React Suspense),直至其被設定。(#1639)
這有助於避免尷尬的編碼(例如不必要的將類型標示為可為 Null)或預設值的替代值。以下是一個極簡文字原子的範例
atom<string>({key: 'MyString'});
當原子使用原子效應初始化且預設值並非必要時,這會非常有用
atom({
key: 'MyQuery',
effects: [
dbSyncEffect({query, variables}),
],
});
其他新功能
優化 / 最佳化
自動保留快照以維持非同步回呼的執行時間長度。
使用 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.
}
})
如果你希望明確地評估選擇器值為 Promise
、Loadable
或 RecoilState
型態物件,那麼現在你可以用 selector.value()
或 atom.value()
包裝它們。
selector({
key: 'Key',
get: ({get}) => {
// Returns an immediate synchronous value
return selector.value(Promise.resolve('Promise as a value'));
},
});
這只是一個次要變更。它有助於讓 API 更一致以處理包裝器,例如 Promise
和 Loadable
,儘管還未在整個 API 中提供。但是,它有助於預設未來可能明確地將原子和選擇設定為非同步值或錯誤狀態。
其他重大變更
useRecoilCallback()
現在提供最新狀態的快照,而不是有錯誤的最新呈現狀態。(#1610、#1604)