Recoil 0.6 針對 React 18 推出許多改良支援,包括並發呈現和轉換,還有新的 API、修正和最佳化功能。
React 18
Recoil 0.6 使用 React 18 的最新 API,以提升安全性與效能。這個版本與 並發呈現 和 <React.StrictMode>
相容,這對於測試和找出並發呈現的潛在問題非常有用。現在可將 Recoil 和 React 狀態變更集中於同一批次處理,以維持同步,提供一致的狀態檢視。即使使用較舊版本的 React,這些改良功能也有部分適用。在嘗試使用 React 18 時,請使用最新的 RC 版本,因為最初的 React 18.0.0-rc.0
套件有一些漏洞,但已獲得修復。
並發呈現和轉換
React 18 提供了一組新的 Hook useTransition()
,以便在等待新狀態準備好時,能控制在狀態轉換期間要呈現的內容。Recoil 應與這種方法相容,並提供與 React 狀態一致的檢視。不過,React 18 可能會回退發生並發更新,現在尚未正式支援根據外部儲存的狀態變更,發起轉換。React 團隊正在研究這項支援,但在這之前,我們已透過以下 Hooks 加入試驗支援。此 API 視為試驗性質,因為我們可能尚未找到未處理的一些使用案例。
useRecoilState_TRANSITION_SUPPORT_UNSTABLE()
useRecoilValue_TRANSITION_SUPPORT_UNSTABLE()
useRecoilValueLoadable_TRANSITION_SUPPORT_UNSTABLE()
以下範例說明在新結果載入時,顯示目前結果
function QueryResults() {
const queryParams = useRecoilValue_TRANSITION_SUPPORT_UNSTABLE(queryParamsAtom);
const results = useRecoilValue_TRANSITION_SUPPORT_UNSTABLE(myQuerySelector(queryParams));
return results;
}
function MyApp() {
const [queryParams, setQueryParams] = useRecoilState_TRANSITION_SUPPORT_UNSTABLE(queryParamsAtom);
const [inTransition, startTransition] = useTransition();
return (
<div>
{inTransition ? <div>[Loading new results...]</div> : ''}
Results: <React.Suspense><QueryResults /></React.Suspense>
<button
onClick={() => {
startTransition(() => {
setQueryParams(...new params...);
});
}
>
Start New Query
</button>
</div>
);
}
新功能
- Recoil 回呼
useRecoilCallback()
現在也能更新選取快取,類似於useRecoilRefresher_UNSTABLE()
。(#1413)- 使用
getCallback()
的選取器中的回呼,現在除了可讀取狀態外,還能變更、更新和執行狀態,類似於useRecoilCallback()
。(#1498)
- 儲存 ID - 現在可以使用
useRecoilStoreID()
(#1417)或 atom 效果 中的storeID
參數 (#1414)取得StoreID
。 RecoilLoadable.of()
和RecoilLoadable.all()
工廠現在允許字面值、非同步承諾或 Loadable。這相當於Promise.resolve()
和Promise.all()
(#1455、#1442)。- 新增 Snapshots 的
.isRetained()
方法,並在開發時檢查使用.retain()
時是否已釋放 snapshot(#1546)
重大變更
- Atom 效果
useGetRecoilValueInfo_UNSTABLE()
和Snapshot#getInfo_UNSTABLE()
始終回傳節點type
。(#1547)0.3
發行版提出必須留存 Snapshot 以便後續使用,但這充其量只是一個警告。現在,為了讓非同步的選擇器得以解析,必須留存 Snapshot。此處有文件說明 此處 與 此處。後續版本會進一步強制執行這一點,因為垃圾收集功能已發行。